我有一个顶点着色器,我在其中进行纹理查找以确定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的最新GM Beta
答案 0 :(得分:10)
我刚试过这个。使用iOS 4.3,可以在设备和模拟器上的顶点着色器上进行纹理查找。虽然有点奇怪(这也许是为什么它不像szu所说的那样“官方”)。在实际设备上(我在iPad 2上测试过),你必须在片段着色器和顶点着色器上进行查找。也就是说,如果您实际上没有在片段着色器上使用它,您仍然必须以某种方式引用它。这是一个简单的例子,我在传递纹理并使用红色像素稍微重新定位顶点的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);
}
上稍微更全面地写了这篇文章
答案 1 :(得分:6)
来自官方的“OpenGL ES Programming Guide for iOS”,“平台笔记”部分
“您无法在顶点着色器中使用纹理查找。”
答案 2 :(得分:1)
这不是唯一在SIM卡与设备上表现不同的东西。我会向你提出与其他人一样的建议:当你需要测试它们应该如何在设备上进行测试时,忽略模拟器。只测试逻辑,功能等内容,而不是在SIM卡上查看,只有你可以。
答案 3 :(得分:1)
我有一种感觉iPad(或iPhone)上的GLES不支持在顶点着色器中查找纹理,但是不要引用我。
如果它确实支持顶点着色器中的纹理元素查找,那么您的纹理坐标是否可以剪裁或包裹?因为1.0x1.0在纹理IIRC之外。
包装模式下的1.0x1.0应为0.0x0.0。 削波中的1.0x1.0应该是最后一个纹素。
答案 4 :(得分:1)
我自己尝试了这一点,当在顶点着色器中使用时,Texture2D 确实在iOS 4.2下的iPad(设备和模拟器)上工作。
我最好的猜测是你启用了mip映射,这就是问题所在。我注意到使用Texture2D在顶点着色器中进行的mip映射查找在模拟器中工作,但在设备上没有。您不能在顶点着色器中使用带有Texture2D的mip贴图,因为它无法选择要使用的mip-map级别。您需要为该纹理禁用mip-mapping,或者使用支持mip贴图的Texture2DLod。