Opengl es 基于纹理像素为平面着色

Opengl es 基于纹理像素为平面着色,opengl-es,glsl,webgl,texture2d,glsles,Opengl Es,Glsl,Webgl,Texture2d,Glsles,使用着色器,我尝试给平面上色,以便它复制纹理上的像素。纹理为32x32像素,平面在空间坐标中的大小也为32x32 有人知道我将如何检查纹理上的第一个像素,然后使用它为平面上的第一个正方形(1x1)着色吗 生成的纹理示例:(第一个像素故意为红色) 使用坐标为(0,0)的vec2的代码并不像我预期的那样工作。我假设(0,0)处的颜色为红色,但不是,而是绿色: vec4 color = texture2D(texture, vec2(0, 0)); 我想我遗漏了一些东西,或者不理解texture2

使用着色器,我尝试给平面上色,以便它复制纹理上的像素。纹理为32x32像素,平面在空间坐标中的大小也为32x32

有人知道我将如何检查纹理上的第一个像素,然后使用它为平面上的第一个正方形(1x1)着色吗

生成的纹理示例:(第一个像素故意为红色)

使用坐标为(0,0)的vec2的代码并不像我预期的那样工作。我假设(0,0)处的颜色为红色,但不是,而是绿色:

vec4 color = texture2D(texture, vec2(0, 0));
我想我遗漏了一些东西,或者不理解texture2D,因为(0,0)似乎也不是结束像素

如果有人能帮助我,我将不胜感激。谢谢


编辑:
谢谢你的评论和回答!使用此代码,它现在可以工作了:

// 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));
也就是说,每个“块”的边缘都有锯齿状的线条。在我看来,我的数学是关闭的,它对边应该是什么颜色感到困惑,因为我在只使用顶点颜色时没有这个问题。有人能看出我哪里做错了,或者怎样才能做得更好吗?
再次感谢


是的。。。正如Ben Pious在评论中提到的,请记住WebGL在左下角显示0,0

此外,为了索引到纹理中,请尝试从每个像素的“中间”进行采样。在32x32源纹理上,要获得所需的像素(0,0),请执行以下操作:

texture2D(theSampler, vec2(0.5/32.0, 0.5/32.0));
或者更一般地说

texture2D(theSampler, vec2((xPixelIndex + 0.5) / width, (yPixelIndex + 0.5) / height);
这仅当您显式访问纹理像素时;如果要从顶点着色器(例如(-1,-1)到(1,1)正方形,并将不同的vec2((x+1)/2,(y+1)/2)传递到片段着色器)得到插值和传递的值,则“每个像素的中间”会反映在不同的值中


但这可能只是本所说的Y-up

如果您有GL-ES 3.0,您可以使用。否则,答案可能会有所帮助。谢谢链接。显然,WebGL不支持texelFetch,所以很遗憾,我不能使用它:(我相信OpenGL ES的坐标系是从左下角开始的——在iOS上,有时需要垂直翻转图像。再次感谢您的回答。:P按照您和Ben Pious所说的做了,现在可以工作了,但是锯齿线有问题。如果您愿意再次帮助我,我已经编辑了我的问题。:)回到办公室,我会说,“请把原来的bug修复好,然后把新的bug提交给新的发行版”:-,我不完全确定你的新代码在做什么,但也许所有的楼层都不需要;他们可能阻碍了WebGL的插值。您可以尝试使用texture2D(texture,vec2(verpos2.x,verpos2.z));看起来它们的射程是0到31?现在知道了。谢谢大卫。:)