GLSL片段位置

7

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

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

以这种方式,我可以将四分之一的区域涂成蓝色,另外四分之一涂成红色,或者我可以决定在哪里放置红色或蓝色。
想象一下,我有一个50x50像素的四边形。
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几乎总是如此,有些四边形是黄/绿色的。

我希望在片段着色器中改变纹理坐标,这样我就应该得到一个渐变,我错了吗?


要“理解”哪个位置(因此是几何的哪一“半”)?屏幕空间位置?世界空间位置?视图空间位置?哪一个? - Christian Rau
本地位置是指四元数在世界空间中的位置,还是其他什么?“将像素涂成一半一半”的意思是什么?使用此标志是否对实际问题有任何意义(也就是说,您是否想根据“理解位置”动态计算此标志)?我非常难以理解您实际想要实现什么。 - Christian Rau
2个回答

5

如果您想知道四边形内的坐标,您需要自己计算。为了达到这个目的,您需要创建一个新的插值器(例如vec2 quadCoord),并对每个顶点进行适当的设置,这意味着您可能还需要将其添加为属性,并通过顶点着色器传递它。例如:

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

main() {
    quadCoord = quadCoordIn;
              :

在绘制四边形时,您需要在绘图代码中添加此属性。对于每个四边形,顶点的quadCoordIn值可能为(0,0)、(0,1)、(1,1)和(1,0)——如果您喜欢,也可以使用其他坐标系统,但这是最简单的。

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


嗨,Chris,谢谢你的回答,还有一件事,我认为如果我在我的cpp代码中不启用纹理,纹理坐标将是常数或0或1。我之所以发现这一点是因为使用纹理坐标对片段进行着色,我只得到了两种颜色,这正确吗(我的意思是,我需要启用和绑定纹理,还是OpenGL不会在片段着色器中给我正确的纹理坐标)? - user1583007

3

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

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的答案就是正确的方法。


嗨,Christian,感谢你的回答,你是正确的,我需要访问每一个简单的四边形,所以gl_FragCoord对我没有用 :( - user1583007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接