小编bad*_*sel的帖子

在iOS中的opengl顶点数据中对齐有多重要

OpenGL ES编程指南讨论了应避免错位的顶点数据,并给出了将数据与4字节块对齐的示例.

OpenGL ES编程指南

未对齐与对齐的顶点数据

然而,在我发现的大多数演示材料和教程中,我没有看到有人这样做.以下示例来自71 Squared上的演示项目:

static const SSTexturedVertexData3D EnemyFighterVertexData[] = {
    {/*v:*/{1.987003, -0.692074, -1.720503}, /*n:*/{0.946379, -0.165685, -0.277261}, /*t:*/{0.972816, 0.024320}},
Run Code Online (Sandbox Code Playgroud)

你怎么会这样做?在v中添加一个虚拟0.0,在t中添加n和2个虚拟?

我的猜测是,如果你只是每个应用程序加载一次顶点数据,那就没那么重要了,但是如果你绑定并重新绑定到每个渲染帧上的不同数组就很重要了.我的计划是将我的所有阵列组合成一个,但我很好奇.

iphone 3d ipad ios opengl-es-2.0

8
推荐指数
1
解决办法
1589
查看次数

未知的类型名称'NSError'和其他

我不是一个菜鸟,但我现在感觉像是一个人.

我拿了一个现有的工作应用程序.一个在Xcode 5下工作,现在可以在Xcode 6下运行.它可以很好地编译并运行.我在Xcode 6中开始了一个新项目,并开始使用我的工作应用程序的结构重建一个新的应用程序shell.移动我在每个应用程序中使用的所有标准库.我已经在Xcode 5下完成了几次没有问题.

但是现在当我构建时,我在特定的库(TBXML)中遇到了很多错误,但即使它有相同的库,我也没有在我的其他工作项目中得到任何错误.如果我把那些文件拿出来(所以它没有编译它们)没有错误,应用程序启动正常.

我还没有包括图书馆.如果我做或不做,也会出现相同的错误.但它们列在编译源下,因此它们正在编译.

错误是这样的:......等等....../TBXML/TBXML-Headers/TBXML.h:124:49:未知类型名称'NSError'

在线上:

typedef void (^TBXMLFailureBlock)(TBXML *tbxml, NSError *error);
Run Code Online (Sandbox Code Playgroud)

....等等..../TBXML/TBXML-Headers/TBXML.h:126:71:未知类型名称'NSString'

在线上:

typedef void (^TBXMLIterateAttributeBlock)(TBXMLAttribute *attribute, NSString *attributeName, NSString *attributeValue);
Run Code Online (Sandbox Code Playgroud)

....等等..../TBXML/TBXML - 页眉/ TBXML.h:133:20:无法找到 'NSObject的' 接口声明, 'TBXML' 的超

在线上:

@interface TBXML : NSObject {
Run Code Online (Sandbox Code Playgroud)

要检查清单的项目:

  1. 我确实拥有包括基金会在内的所有合适的框架.
  2. 没有这些文件的编译器标志 - 与旧项目匹配.
  3. Build for和Target iOS在两个项目中都是相同的.
  4. 我不是在寻找"不要使用TBXML",因为它在其他项目中运行良好.

我假设项目设置有些不同,因为我的旧项目是在Xcode 5下创建的,而这是在Xcode 6下创建的.但我看起来到处都是我知道的.

*更新*

这似乎解决了这个问题:iOS 8扩展中的TBXML无法构建

我想知道为什么.问题仍然存在.为什么一个项目需要#include而另一个项目不需要?主要区别在于一个是在Xcode 5下创建的,另一个是在Xcode 6下创建的.但是这两个项目现在都在Xcode 6中.

xcode objective-c ios

7
推荐指数
1
解决办法
9796
查看次数

最有效的多纹理方式 - iOS,OpenGL ES2,优化

我正在尝试在iOS上找到处理OpenGL ES2中多纹理的最有效方法."高效"我的意思是即使在较旧的iOS设备(iPhone 4及更高版本)上也能实现最快的渲染 - 而且还可以平衡便利性.

我考虑过(并尝试过)几种不同的方法.但是遇到了一些问题和疑问.

方法1 - 我的碱基值和正常值是rgb,没有ALPHA.对于这些物体,我不需要透明度.我的发射和镜面反射信息都只是一个通道.为了减少texture2D()调用,我认为我可以将发射存储为基础的alpha通道,将镜面反射存储为法线的alpha.每个都在他们自己的文件中,它看起来像这样:

两个双向纹理

到目前为止我的问题是找到一个支持完整的非预乘alpha通道的文件格式.PNG只是没有为我工作.我试图将此作为PNG保存的每一种方式都将.alpha与.rgb文件保存(通过photoshop)基本上摧毁了.rgb.当我重新加载文件时,任何具有0.0 alpha的像素都有黑色rgb.我在这里发布了这个问题没有活动.

我知道如果我能找到一种方法来保存和加载这个独立的第4通道,这种方法会产生更快的渲染.但到目前为止,我还没有能够继续前进.

方法2 - 当这不起作用时,我转到单个4向纹理,其中每个象限具有不同的地图.这不会减少texture2D()调用,但会减少着色器中正在访问的纹理数量.

一个4向纹理

4向纹理确实需要我修改着色器中的纹理坐标.为了模型的灵活性,我将texcoords保留在模型的结构中,并在着色器中修改它们,如下所示:

v_fragmentTexCoord0 = a_vertexTexCoord0 * 0.5;
v_fragmentTexCoord1 = v_fragmentTexCoord0 + vec2(0.0, 0.5);     // illumination frag is up half
v_fragmentTexCoord2 = v_fragmentTexCoord0 + vec2(0.5, 0.5);     // shininess frag is up and over
v_fragmentTexCoord3 = v_fragmentTexCoord0 + vec2(0.5, 0.0);     // normal frag is over half
Run Code Online (Sandbox Code Playgroud)

为了避免动态纹理查找(感谢Brad Larson),我将这些偏移移动到顶点着色器并将它们保留在片段着色器之外.

但我的问题是:减少着色器中使用的纹理采样器的数量是否重要?或者我最好在这里使用4种不同的较小纹理?

我遇到的一个问题是在不同的地图之间流血.由于线性纹理映射,1.0的texcoord在一些蓝色正常像素中进行平均.这在接缝附近的物体上添加了蓝色边缘.为了避免这种情况,我不得不将我的UV贴图更改为不太靠近边缘.对很多物体来说,这是一种痛苦.

方法3是组合方法1和2.并且在一侧具有base.rgb + emission.a而在另一侧具有normal.rgb + specular.a.但我仍然有这个问题获得一个独立的alpha保存在文件中.

也许我可以将它们保存为两个文件,但在加载过程中将它们组合起来然后再发送到openGL.我得尝试一下. …

shader objective-c texture-mapping ios opengl-es-2.0

6
推荐指数
1
解决办法
644
查看次数

Opengl着色器问题 - 奇怪的光反射伪影

几天来我一直在努力.我想我最终将它缩小到每顶点切线的问题,但我不确定解决它的最佳方法.

Context是iPhone app,opengl es2使用我自己的引擎.我的着色器是使用提供的每个顶点切线创建TBN矩阵的凹凸贴图(法线贴图).顶点着色器将光矢量和眼睛矢量转换为切线空间,将它们传递给片段着色器并计算光源.但是我前两个测试模型中的一些几何体在照明中显示出奇怪的瑕疵.在镜面反射分量中最容易看到.

在试图调试这个时,我用普通的平面png替换了法线贴图.所有像素都是128,128,255.我还对颜色进行了硬编码.

我的第一个模型是按钮形状.它将人工制品显示为外圈上的扇形镜面撞击.需要注意的重要一点是,这里的UV映射方法是"平坦的",以使垂直于映射的边基本上划过纹理.我认为这会使切线很难计算出几何形状,因为其中两个点的纹理坐标完全相同.

我尝试调试渲染器将gl_FragColor设置为不同的变量.当将它设置为每个顶点法线时,我们看到扇形消失,表明法线是正确的.但是当将它设置为每个顶点切线时,您可以看到扇贝.

在此输入图像描述

下一个形状是一个简单的球体.有了它,模型的顶部和底部就是工件显示的位置.在线框中,您将看到这是几个三角形在一个顶点相交的地方.由于每个三角形在那里具有完全不同的UV映射,所以我无法围绕切线的意义.

如果我不显示着色器代码,我想我会得到很多瑕疵......

顶点着色器:

v_fragmentTexCoord0 = a_vertexTexCoord0;

gl_Position = u_modelViewProjectionMatrix * vec4(a_vertexPosition,1.0);

vec3 normal = normalize(u_normalMatrix * a_vertexNormal);
vec3 tangent = normalize(u_normalMatrix * a_vertexTangent);
vec3 bitangent = cross(normal, tangent);
mat3 TBNMatrix = mat3(tangent, bitangent, normal);

v_eyeVec =  -a_vertexPosition.xyz;
v_eyeVec *= TBNMatrix;

v_lightVec = u_lightPosition - a_vertexPosition.xyz;
v_lightVec *= TBNMatrix;

v_normal = a_vertexTangent;
Run Code Online (Sandbox Code Playgroud)

片段着色器:

vec3 norm = texture2D(u_normalSampler, v_fragmentTexCoord0).rgb * 2.0 - 1.0;
vec4 baseColor = vec4(0.6015625,0.0,0.0,1.0); // is normally texture2D(u_textureSampler,v_fragmentTexCoord0);

float dist = length(v_lightVec); …
Run Code Online (Sandbox Code Playgroud)

iphone 3d opengl-es glsl ios

5
推荐指数
1
解决办法
1063
查看次数

在TBN矩阵中,法线,切线和双切线矢量始终垂直吗?

这与另一个问题(图中的图像)中描述的问题有关:

OpenGL着色器问题-怪异的光反射伪像

我有一个.obj导入器,它创建一个数据结构并计算切线和切线。这是我对象中第一个三角形的数据:

数据结构

我对切线空间的理解是法线从顶点向外指向,切线垂直于法线矢量(正交吗?)并指向纹理中正S的方向,而双切线垂直于两者。我不确定您怎么称呼它,但我认为这3个向量形成了看起来像旋转或变换后的x,y,z轴。它们不会是3个随机定向的向量,对吗?

我的理解也是:法线图中的法线提供了新的法线向量。但是在切线空间纹理贴图中,rgb编码法线和每个顶点法线之间没有内置的方向。因此,您可以使用TBN矩阵来弥合间隙并将它们放在相同的空间中(或在正确的空间中获得照明)。

但是后来我看到了对象数据...我的结构有270个顶点,并且所有切线Y的顶点均为0。这对切线数据正确吗?这些切线是像顶点法线空间一样吗?还是它们看起来完全不对?还是我对它的工作原理和数据正确感到困惑?

为了进一步解决另一个问题中的问题,我需要确保我的数据正确并且对切线空间照明数学的工作方式有所了解。

opengl math 3d lighting matrix

3
推荐指数
1
解决办法
1637
查看次数

opengl es2预乘与直接alpha +混合

在iphone上的Opengl es2.一些对象由多层精灵与alphas组成.

然后我也有UI元素,它们也是由各种精灵组合在一起的,我淡入/淡出其他一切.我通过调整着色器中的alpha来淡化.

我的纹理是PNG与alphahop中制作的alpha.我没有故意为他们做好准备.我希望它们是直的alpha,但在我的应用程序中,它们表现得好像它们被预先乘以我可以看到在白色背景上绘制的白色精灵周围的黑色边缘.

如果我将混合模式设置为:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

这些元素很好地融合在一起,没有奇怪的边缘.但是当元素逐渐消失时,它们最终会成为POP.它们将开始消退但不会一直下​​降到alpha零.所以在淡出动画结束时,当我删除元素时,它们"弹出"会导致它们没有完全消失.

如果我将混合模式切换为:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

元素很好地淡化和淡化.但是白色元素上的任何白色都有一个看起来像alpha预乘的暗边缘.查看白框顶部绘制的白色圆圈:

在此输入图像描述

但是场景中的其他混合物对我来说很好看.其他透明物体很好地融合在一起.

另一个重要的注意事项是我的着色器处理元素和颜色元素的不透明度.对于绘制的每个东西,我乘以元素颜色,最后的alpha乘以不透明度值:

void main(void)
{
    gl_FragColor = texture2D(u_textureSampler,v_fragmentTexCoord0);
    gl_FragColor = vec4(gl_FragColor.r*u_baseColor.r,gl_FragColor.g*u_baseColor.g,gl_FragColor.b*u_baseColor.b,gl_FragColor.a*u_baseColor.a * u_opacity);
}
Run Code Online (Sandbox Code Playgroud)

这允许我在我的精灵表中拍摄一个白色物体,并使其成为我想要的任何颜色.或者使用灰色的baseColor使对象变暗.

每当我想到我理解这些混合模式时,我就会开始怀疑自己.

是否有其他混合模式组合在我的精灵上有光滑的边缘,并且还支持着色器中的alpha淡化/混合?

我假设需要GL_SRC_ALPHA在着色器中使用alpha进行混合.

或者我的问题是我需要使用除PSD以外的东西来保存我的精灵表吗?因此在这一点上几乎是不可能的.

更新:

我认为答案可能只是否定,没有办法做我想要的.第二种混合模式应该是正确的.但它有可能是将RGB与某个地方的alpha相乘,或者它在源文件中被预乘.我甚至尝试通过添加以下内容在上面的着色器中预先复制alpha:

gl_FragColor.rgb *= glFragColor.a;
Run Code Online (Sandbox Code Playgroud)

但这只会使衰落看起来很糟糕,因为当它们逐渐淡出时,它们会变成灰色.如果我自己预先设定alpha并使用上面的其他混合模式,那么事情看起来和我原来的一样.它们在没有弹出的情况下逐渐消失,但你仍然可以看到光环.

alphablending opengl-es ios

3
推荐指数
1
解决办法
4707
查看次数

53*.01 = .531250

我正在将字符串日期/时间转换为数字时间值.在我的情况下,我只是用它来确定某些东西是否比其他东西更新/更旧,所以这个小小数问题不是一个真正的问题.它不需要秒精确.但它仍然让我挠头,我想知道为什么..

我的日期是@"2010-09-08T17:33:53 + 0000"的字符串格式.所以我写了这个小方法来返回一个时间值.在没有人关心的情况下,如果有人在数月内跳了几天,有28天或31天.在我的数学中,可以假设所有月份都有31天,而且年份有31*12天,因为我不需要两个时间点之间的差异,只知道一个时间点是否晚于另一个时间点.

-(float) uniqueTimeFromCreatedTime: (NSString *)created_time {
float time;
    if ([created_time length]>19) {
      time = ([[created_time substringWithRange:NSMakeRange(2, 2)]floatValue]-10) * 535680; // max for 12 months is 535680.. uh oh y2100 bug!
      time=time + [[created_time substringWithRange:NSMakeRange(5, 2)]floatValue] * 44640; // to make it easy and since it doesn't matter we assume 31 days
      time=time + [[created_time substringWithRange:NSMakeRange(8, 2)]floatValue] * 1440;
      time=time + [[created_time substringWithRange:NSMakeRange(11, 2)]floatValue] * 60;
      time=time + [[created_time substringWithRange:NSMakeRange(14, 2)]floatValue];
      time = time + [[created_time substringWithRange:NSMakeRange(17, 2)]floatValue] …
Run Code Online (Sandbox Code Playgroud)

iphone floating-point objective-c nsnumber

2
推荐指数
2
解决办法
352
查看次数