顶点着色器中的纹理查找在iPad设备与iPad模拟器 - OpenGL ES 2.0上的行为有所不同

时间:2010-11-15 18:56:10

标签: ipad ios opengl-es shader

我有一个顶点着色器,我在其中进行纹理查找以确定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

5 个答案:

答案 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);  
}

我在http://www.mat.ucsb.edu/a.forbes/blog/?p=453

上稍微更全面地写了这篇文章

答案 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。