顶点着色器中的纹理查找在iPad设备和iPad模拟器上的表现不同-OpenGL ES 2.0

顶点着色器中的纹理查找在iPad设备和iPad模拟器上的表现不同-OpenGL ES 2.0,ipad,ios,opengl-es,shader,Ipad,Ios,Opengl Es,Shader,我有一个顶点着色器,我在其中执行纹理查找以确定gl_位置。我使用它作为GPU粒子模拟系统的一部分,其中粒子位置存储在纹理中 似乎:vec4texturevalue=texture2D(dataTexture,vec2(1.0,1.0))在模拟器上的行为与iPad设备不同。在模拟器上,纹理查找成功(该位置的值为0.5、0.5),并且“我的粒子”出现在那里。然而,在iPad上,纹理查找不断返回0.0,0.0 我尝试了GL_FLOAT和GL_UNSIGNED_BYTE格式的纹理 还有其他人经历过吗?G

我有一个顶点着色器,我在其中执行纹理查找以确定gl_位置。我使用它作为GPU粒子模拟系统的一部分,其中粒子位置存储在纹理中

似乎:
vec4texturevalue=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测试版,这不是sim卡和设备中唯一表现不同的东西。我会给你和其他人一样的建议:当你需要测试设备上的东西时,忽略模拟器。只测试逻辑、功能,而不是sim卡上的外观,如果可以的话。

我感觉iPad(或iPhone)上的GLES不支持顶点着色器中的纹理查找,但请不要引用我的话

如果它确实支持顶点着色器中的texel查找,那么您是否已剪裁或包裹纹理坐标?因为1.0x1.0在纹理IIRC之外

包装模式下的1.0x1.0应为0.0x0.0。
剪裁中的1.0x1.0应该是最后一个texel。

我自己也尝试过,当在顶点着色器中使用时,Texture2D在iOS 4.2下的iPad(设备和模拟器)上也能工作

我最好的猜测是您启用了mip映射,这就是问题所在。我注意到使用Texture2D在顶点着色器中进行mip映射查找在模拟器中工作,但在设备上不工作。不能在顶点着色器中将mip贴图与Texture2D一起使用,因为它无法选择要使用的mip贴图级别。您需要禁用该纹理的mip映射,或者改用支持mip映射的Texture2DLod。

来自官方“OpenGL ES iOS编程指南”的“平台说明”部分


“不能在顶点着色器中使用纹理查找。”

我也测试了这个。使用iOS 4.3,您可以在设备和模拟器上的顶点着色器上执行纹理查找。不过有一点奇怪(这也许就是为什么它不像szu提到的那样是“官方的”)。在实际的设备上(我在iPad2上测试过),你必须在片段着色器和顶点着色器上进行查找。也就是说,如果您没有在片段着色器上实际使用它,您仍然需要以某种方式引用它。下面是一个简单的示例,我传入一个纹理,并使用红色像素稍微重新定位顶点的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);  
}

我在

右侧对此有一个稍微完整的描述,这就是我一直在做的事情;但我找不到在设备上实现正确行为的方法。这是一个简单的纹理查找,所以我不确定如何修复它。对,在这种情况下,我的纹理是完全相同的“颜色”。数据到处都是0.8。仍然得到0,0作为返回值。我要做的第一件事是在同一纹理上测试一个简单的frag着色器,并尝试在代码中尽可能少地更改。如果显示正确,则顶点着色器或纹理查找中可能出现错误。是的,我使用单独的着色器将纹理显示在四边形上,效果很好。我想答案是,在iPad硬件上的顶点着色器中无法进行纹理查找。如果能够得到证实,那就太好了。我会进一步检查文档,因为我感觉我在某处读到了这篇文章。你所发现的一定是一个bug或“愉快的意外”。在我的iPad上(承认是4.2.1),GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS返回0,这意味着无法在顶点着色器中进行纹理查找。我很好奇你在iPad2上得到的GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS的值是多少。嗨,我的iPad2使用4.3.4时,GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS也返回0(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS和GL_MAX_TEXTURE_IMAGE_UNITS都返回8)。我的猜测是iPad2上的图形卡支持它,但出于某种原因,驱动程序禁用了它,以便在各种iOS设备上有统一的行为。我还没有在iPhone或iPad1上尝试过。iOS iPad 4.3模拟器也报告了0的GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,但允许您正常地从顶点着色器访问纹理(而不在片段着色器中添加伪纹理查找)。哈,很有趣。。尽管我很想使用这项功能,但如果我的应用程序忽略了报告的值,我对未来某个硬件会破坏我的应用程序太过偏执了(没错,我不会向公众发布使用顶点纹理的应用程序。希望iOS 5会添加此功能。它回到iOS 7-适用于所有设备。现在它也是官方的。他们只花了3年时间就修复了错误:)