webgl着色器和纹理过滤器

时间:2012-04-02 13:45:15

标签: opengl-es webgl

我不熟悉WebGL(猜猜相同的问题会在OpenGL中翻译)。我正在使用顶点和片段着色器渲染我的对象。基本上所有着色器都是获取顶点的输入颜色,并将其保持不变直到片段,所以步骤:

In vertex shader, amongst other things:

attribute vec4 aVertexColor;
varying vec4 vColor;

.................
vColor = aVertexColor;
..................

In shader color:

varying vec4 vColor;

...........
gl_FragColor = vColor;

现在这很好用。然而,从我可以看到片段的插值默认为线性,我想将其更改为最接近。现在,我想做的是:

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);

但这似乎没有任何效果,即使我用gl.LINEAR更改了gl.NEAREST,例如,就我所知,这并没有改变。着色器是否会以某种方式覆盖某些东西,这就是为什么我没有达到预期的效果?result image

现在我已经附上了我得到的结果。现在我的目标是在三个不同颜色的区域(与顶点相同)中设置三角形。所以在我的情况下,我的目标是~1.3蓝色,~1.3绿色,~1.3红色,没有任何中间色。任何提示?

这是我想要获得的:

Desired result

2 个答案:

答案 0 :(得分:2)

我认为你误解了Nearest Filtering主题。如果使用纹理,则拾取最近的纹理像素的颜色,而不是与相邻像素颜色混合。但是,使用您的方法,它不会帮助您在顶点之间保持恒定,而不是混合颜色。我猜你想要的是下面的东西。

How to get a flat, non-interpolated color when using vertex shaders

答案 1 :(得分:1)

你想要的我不相信是可能的。变量值始终被插值,您不能覆盖它以使用最近的值。为了达到理想的效果,我认为你必须分别绘制3个多边形。

你也可以在这个非常特殊的情况下使用一些像素着色器技巧来找到RGB的最大组件,将其设置为1,并将其他两个组件设置为零,但这对任何其他颜色都不起作用。