顶点着色器中的纹理查找在iPad设备与iPad模拟器上performance不同 – OpenGL ES 2.0
我有一个顶点着色器,我做纹理查找来确定gl_Position。 我将它用作GPU粒子模拟系统的一部分,粒子位置存储在纹理中。
看来: vec4 textureValue = texture2D(dataTexture, vec2(1.0, 1.0));
在模拟器上的行为与iPad设备不同。 在模拟器上,纹理查找成功(该位置的值为0.5,0.5),我的粒子出现在那里。 但是,在iPad本身,纹理查找不断返回0.0,0.0。
我已经尝试了格式GL_FLOAT和GL_UNSIGNED_BYTE的纹理。
有没有人经历过这个? GLSL ES规范说纹理查找可以在顶点和片段着色器中完成,所以我没有看到问题是什么。
我正在使用iOS SDK 4.2的最新通用testing版
我只是testing了这一点。 使用iOS 4.3,您可以在设备和模拟器上的顶点着色器上进行纹理查找。 虽然有点奇怪(这也许就是为什么它不像szu提到的那样是“官方的”)。 在实际的设备上(我在iPad 2上testing过),您必须在片段着色器以及顶点着色器上进行查找。 也就是说,如果你没有在片段着色器上使用它,你仍然需要以某种方式引用它。 这里是一个简单的例子,我传递一个纹理,并使用红色像素重新定位顶点的y值一点:
/////fragment shader uniform sampler2D tex; //necessary even though not actually used void main() { vec4 notUsed = texture2D(tex, vec2(0.0,0.0)); //necessary even though not actually used gl_FragColor = vec4(1.0,1.0,1.0,1.0); } /////vertex shader attribute vec4 position; attribute vec2 texCoord; uniform sampler2D tex; void main() { float offset = texture2D(tex, texCoord).x; offset = (offset - 0.5) * 2.0; //map 0->1 to -1 to +1 float posx = position.x; float posy = position.y + offset/8.0; gl_Position = vec4(posx, posy, 0.0, 1.0); }
我在http://www.mat.ucsb.edu/a.forbes/blog/?p=453有一个更全面的写这篇文章
从官方的“用于iOS的OpenGL ES编程指南”一节中的“平台注释”
“你不能在顶点着色器中使用纹理查找。”
这不是在模拟设备中唯一不同的行为。 我会给你同样的build议,我让其他人:忽略模拟器,当你需要testing的东西看他们应该在设备上。 只testing像逻辑,function的东西,不要在SIM上看,只有在可以的情况下。
我有一种感觉,iPad(或iPhone)上的GLES不支持在顶点着色器中查找纹理,但不要引用我。
如果它确实支持顶点着色器中的纹理坐标查找,也许你的纹理坐标被裁剪或包裹了? 因为1.0×1.0在纹理IIRC之外。
1.0×1.0在包装模式下应该是0.0×0.0。 裁剪1.0×1.0应该是最后一个纹素。
我自己尝试过,当在顶点着色器中使用时,Texture2D 可以在iOS 4.2下工作(包括设备和模拟器)。
我最好的猜测是你有mip映射启用,这就是问题所在。 我注意到使用Texture2D的顶点着色器中的mip-mapped查找在模拟器中工作,但在设备上不起作用。 您不能在顶点着色器中使用Texture2D的mip贴图,因为它无法select使用哪个mip贴图级别。 您需要禁用该纹理的mip-mapping,或者使用Texture2DLod来代替mip贴图。