【问题标题】:GLSL Fragment PositionGLSL 片段位置
【发布时间】:2012-08-29 18:06:32
【问题描述】:

对不起,我会重写问题希望清楚。

在我的 .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));

[垂直]

varying vec2 texCoord;

main()
{
    texCoord = gl_MultiTexCoord0.xy;
} 

[碎片]

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 几乎总是,一些四边形是黄色/绿色。

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

【问题讨论】:

  • “了解”哪个位置(以及几何的“一半”)?屏幕空间位置?世界空间位置?视图空间位置?哪一个?
  • 什么是局部位置,你是指四边形在世界空间中的位置还是什么? “将像素着色一半”是什么意思?这个标志的使用对实际问题有什么意义(意思是你想根据“理解位置”以某种方式动态计算这个标志)?我很难理解你真正想要实现的目标。

标签: glsl


【解决方案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 以确定您在四边形中的哪个位置。

【讨论】:

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

除了 Chris Dodd 的回答之外,您还可以通过特殊的片段着色器变量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的答案是正确的方法。

【讨论】:

  • 嗨克里斯蒂安,谢谢你的回答,你说得对,我需要访问每个简单的四边形,所以 gl_FragCoord 对我不起作用:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多