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

kcb*_*ner 8 shader opengl-es ipad ios

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

Ang*_*bes 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);  
}
Run Code Online (Sandbox Code Playgroud)

我在http://www.mat.ucsb.edu/a.forbes/blog/?p=453上对此进行了更为全面的描述.

  • 它又回到了iOS 7 - 适用于所有设备.现在它也是正式的.只花了3年时间来修复任何错误:) (4认同)
  • 嗨,我使用4.3.4的iPad 2也为GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS返回0(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS和GL_MAX_TEXTURE_IMAGE_UNITS都返回8).我的猜测是iPad 2上的显卡支持它,但由于某些原因,驱动程序禁用它,以便在各种iOS设备上有统一的行为.我还没有在iPhone或iPad 1上试过这个.iOS iPad 4.3模拟器还为GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS报告0,但允许您通常从顶点着色器访问纹理(不在片段着色器中添加伪纹理查找). (2认同)

小智 6

来自官方的"OpenGL ES Programming Guide for iOS","平台笔记"部分

"你不能在顶点着色器中使用纹理查找."