GLSL片段位置

时间:2012-08-24 14:27:10

标签: glsl

对不起,我会改写希望明确的问题。

在我的.cpp代码中我创建了一个四边形列表,其中一些有一个标志,在像素着色器中我检查是否设置了这个标志,如果没有设置标志,四边形会变成红色例如,如果设置了标志,我想决定每个像素的颜色,所以如果我需要将标记四边形的一半用红色着色而另一半用蓝色我可以简单地执行以下操作:

if coordinate in quad < something color = red
else colour = blue; 

通过这种方式,我可以将四边形的一半用蓝色染色,另一半用红色染色,或者我可以决定在哪里放置红色或在哪里放置蓝色。

想象一下,我有一个四倍的50x50像素

[FRAG]

if(quad.flag == 1)
  {    
    if(Pixel_coordinate.x<25 ) gl_fragColor = vec4(1.0, 0.0, 0.0, 1.0);
    else gl_fragColor = vec4(0.0, 1.0, 0.0, 1.0);
  }
else
  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);

在这种情况下,我希望带有标志设置的四边形将在每个面部获得两种颜色。 我希望我现在更具体了。

感谢。

只是添加一些我不能使用任何纹理的东西。

好的,我现在就这样做:

每个四边形有4个纹理协调(0,0),(0,1),(1,1),(1,0);

我使用以下方法启用纹理坐标:

glTexCoordPointer(2, GL_SHORT, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 7));

[VERT]

varying vec2 texCoord;

main()
{
    texCoord = gl_MultiTexCoord0.xy;
} 

[FRAG]

varying vec2 texCoord;

main()
{
    float x1 = texCoord.s;
    float x2 = texCoord.t;

    gl_FragColor = vec4(x1, x2, 0.0, 1.0);
}

我总是得到黄色,所以x1 = 1,x2 = 1几乎总是有些四边形是黄色/绿色。

我希望纹理坐标在片段着色器中发生变化,所以我应该得到一个渐变,我错了吗?

2 个答案:

答案 0 :(得分:4)

如果你想知道四元组中的坐标,你需要自己计算它。为此,您需要创建一个新的插值(称之为vec2 quadCoord),并为每个顶点设置适当的,这意味着您可能还需要将其作为属性添加并传递它通过你的顶点着色器。例如:

// in the vertex shader
attribute vec2 quadCoordIn;
varying vec2 quadCoord;

main() {
    quadCoord = quadCoordIn;
              :

绘制四边形时,您需要在绘图代码中输入此属性。对于每个四边形,顶点可能具有(0,0),(0,1),(1,1)和(1,0)的quadCoordIn值 - 您可以使用其他坐标系,如果你更喜欢,但这是最简单的。

然后,在您的片段程序中,您可以访问quadCoord.xy以确定您在四边形中的位置。

答案 1 :(得分:2)

除了 Chris Dodd 的答案之外,您还可以访问当前处理过的片段的屏幕空间坐标(以像素为单位,但实际上是像素中心,因此?.5)特殊片段着色器变量gl_FragCoord

gl_FragColor = (gl_FragCoord.x<25.0) ? vec4(1.0, 0.0, 0.0, 1.0) : vec4(0.0, 1.0, 0.0, 1.0);

但是这会在屏幕空间中提供片段的位置,从而相对于视口的左下角。如果你真的需要知道单个四边形内部的位置(如果你想要实际为每个四边形半个颜色着色更有意义,因为“半切”会因四边形的位置而变化),那么 Chris Dodd 的答案是正确的方法。