GLSL片段位置

use*_*007 6 glsl

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

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

if coordinate in quad < something color = red
else colour = blue; 
Run Code Online (Sandbox Code Playgroud)

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

想象一下,我有一个四倍的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);
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

只是添加一些我不能使用任何纹理.

好的,我现在这样做:

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

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

glTexCoordPointer(2, GL_SHORT, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 7));
Run Code Online (Sandbox Code Playgroud)

[VERT]

varying vec2 texCoord;

main()
{
    texCoord = gl_MultiTexCoord0.xy;
} 
Run Code Online (Sandbox Code Playgroud)

[FRAG]

varying vec2 texCoord;

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

    gl_FragColor = vec4(x1, x2, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*odd 5

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

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

main() {
    quadCoord = quadCoordIn;
              :
Run Code Online (Sandbox Code Playgroud)

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

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