GLSL片段位置

GLSL片段位置,glsl,Glsl,对不起,我将重写问题,希望澄清 在我的.cpp代码中,我创建了一个四边形列表,其中一些四边形有一个标志,在像素着色器中,我检查是否设置了该标志,如果未设置该标志,四边形将以红色显示。例如,如果设置了该标志,我想确定每个像素的颜色,因此,如果我需要将标记的四边形的一半涂成红色,另一半涂成蓝色,我可以简单地执行以下操作: if coordinate in quad < something color = red else colour = blue; [垂直] varying vec2 t

对不起,我将重写问题,希望澄清

在我的.cpp代码中,我创建了一个四边形列表,其中一些四边形有一个标志,在像素着色器中,我检查是否设置了该标志,如果未设置该标志,四边形将以红色显示。例如,如果设置了该标志,我想确定每个像素的颜色,因此,如果我需要将标记的四边形的一半涂成红色,另一半涂成蓝色,我可以简单地执行以下操作:

if coordinate in quad < something color = red
else colour = blue; 
[垂直]

varying vec2 texCoord;

main()
{
    texCoord = gl_MultiTexCoord0.xy;
} 
[论坛]

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);
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几乎总是,一些四元组是黄色/绿色的


我希望碎片着色器中的纹理坐标发生变化,因此我应该得到一个渐变,我错了吗?

如果你想知道四边形中的坐标,你需要自己计算。为此,您需要创建一个新的插入体(称之为类似于
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 Dodd的答案,您还可以访问屏幕空间坐标(以像素为单位,但实际上是像素中心,因此
?.5
)通过特殊片段着色器变量
gl\u 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);

gl_FragColor=(gl_FragCoord.xTo“了解”哪个位置(从而了解几何体的“一半”)?屏幕空间位置?世界空间位置?视图空间位置?哪一个?局部位置是什么,你是指四边形在世界空间中的位置还是什么?什么是“将像素对半着色”?此标志的使用对实际问题是否有任何意义(意味着您是否希望基于“理解位置”以某种方式动态计算此标志)?我真的很难理解你到底想要实现什么。嗨,克里斯蒂安,谢谢你的回答,你是对的,我需要访问每个简单的四边形,这样gl_FragCoord就不适合我了:(嗨,克里斯,谢谢你的回答,还有一件事,我想如果我没有在我的cpp代码中启用纹理,纹理坐标是恒定的,或者是0或1,我确实发现了这一点,因为用纹理坐标给片段着色我只得到了两种颜色,对吗(我的意思是,我是否还需要启用和绑定纹理,或者opengl不会在片段着色器中为我提供正确的纹理坐标?)
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);