【发布时间】:2013-11-03 08:15:37
【问题描述】:
我尝试使用着色器为平面着色,以便复制纹理上的像素。纹理为 32x32 像素,平面在空间坐标中的大小也是 32x32。
有谁知道我将如何检查纹理上的第一个像素,然后用它为平面上的第一个正方形 (1x1) 着色?
生成的纹理示例:(第一个像素故意为红色)
此代码使用坐标为 (0,0) 的 vec2 无法按预期工作。我假设 (0,0) 处的颜色是红色,但不是,它是绿色:
vec4 color = texture2D(texture, vec2(0, 0));
我想我缺少一些东西,或者不了解 texture2D,因为 (0,0) 似乎也不是结束像素。
如果有人可以帮助我,将不胜感激。谢谢。
编辑:
感谢cmets和答案!使用此代码,它现在可以工作了:
// Flip the texture vertically
vec3 verpos2 = verpos.xyz * vec3(1.0, 1.0, -1.0);
// Calculate the pixel coordinates the fragment belongs to
float pixX = floor(verpos2.x - floor(verpos2.x / 32.0) * 32.0);
float pixZ = floor(verpos2.z - floor(verpos2.z / 32.0) * 32.0);
float texX = (pixX + 0.5) / 32.0;
float texZ = (pixZ + 0.5) / 32.0;
gl_FragColor = texture2D(texture, vec2(texX, texZ));
也就是说,我遇到了每个“块”边缘的锯齿线问题。在我看来,我的数学已经关闭,并且对边应该是什么颜色感到困惑,因为我只使用顶点颜色时没有这个问题。任何人都可以看到我哪里出了问题或如何做得更好?
再次感谢!
【问题讨论】:
-
如果你有 GL-ES 3.0,你可以使用'texelFetch'。否则,this 回答可能会有所帮助。
-
感谢您的链接。显然 WebGL 不支持 texelFetch,所以很遗憾我不能使用它:(
-
我认为OpenGL ES的坐标系是从左下角开始的——在iOS上,有时需要垂直翻转图像。
标签: opengl-es glsl webgl texture2d glsles