2012-08-24 45 views
6

对不起,我会重写希望清楚的问题。GLSL Fragment Position

在我的.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米x 2几乎总是= 1,一些四边形是黄色/绿色。

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

+0

要*“理解”*哪个位置(以及几何的哪个*“半”*)?屏幕空间位置?世界空间的位置?观看空间的位置?哪一个? –

+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来确定您在四边形中的位置。

+0

嗨克里斯,谢谢你的回答,只是另一件事,我认为如果我没有在我的cpp代码中启用纹理,纹理坐标是恒定的,或者是0或1,我确实发现了这一点,因为用纹理坐标我只得到两种颜色,这是否正确(我的意思是,我是否还需要启用和绑定纹理,否则opengl不会在片段着色器中给我正确的纹理坐标?) – user1583007

2

除了多德的回答,您还可以访问的屏幕空间坐标(以像素为单位,但实际像素中心,并因此?.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多德的答案是正确的做法。

+0

嗨,Christian,谢谢你的回答,你是对,我需要访问每个简单的四边形,所以gl_FragCoord不适用于我:( – user1583007