2013-01-05 35 views
7

我想要一个不错的渐变效果。但在一分钟之内,它确实是斑驳的,你可以在两个三角形之间看到似乎。我有以下着色器vert和frag。我认为唯一能做的就是交换到预先生成的纹理。OpenGL3.2 GLSL块插补

对于两个三角形,数据被漂浮为浮动[x y] [R G B],我不认为C++源代码值得展示。

VERT 的#Version 330

layout(location = 0) in vec2 position;  
layout(location = 1) in vec3 incolor; 

smooth out vec3 color; 

void main() 
{ 
    color = incolor; 
    gl_Position = vec4(position.x,position.y,0.0,1.0); 
} 

FRAG 的#Version 330

smooth out vec4 outputColor; 
smooth in vec3 color; 

void main() 
{ 
    outputColor = vec4(vec3(color),1.0); 
} 

RESULT blocky

寻找在单三角形示出了块状岬 enter image description here

+0

你可能会发现你通过将要内插的颜色粘贴到顶点和片段着色器之间的tex-coord中来获得更高的精度。 – JasonD

+1

@JasonD:没有“tex-coord”这样的东西;只有用户定义的插值。 –

+0

@Andrew:你怎么知道这是一个插值问题,而不是你的显示位深度,屏幕,或者你如何可视化它的问题? –

回答

6

这是线性插值的一个正确行为quad的属性。请记住,四边形总是呈现为两个三角形。有两种可能性:以对角线\或对角线为/作为共同边缘。如何插入属性现在变得模糊(在两种情况下都不相同)。

我会告诉你一个与你的相似的例子。

enter image description here

三角形由\对角线隔开。

enter image description here

三角形由/对角线隔开。

在两种情况下,顶点的颜色有:

000000 top left 
3B3B3B top right + bottom left 
FFFFFF bottom right 

一种解决方案是提供只读属性,其导致明确的内插颜色值(颜色)。以下情况如此。

考虑从左上角到右下角的一条直线(让我们用一个指定的基色称这些基顶点)。左上角的值为0,右下角1。每个其他顶点(在这种情况下,左下角,右上角)必须与该虚线垂直投影,并将相应的值分配给该顶点。在这种情况下(一个正方形),其他两个角的值分别为.5。这些角的颜色必须是两种基本颜色的混合值,其中的alpha值与刚刚计算的值相对应。

在上面的例子中,其他两个角的颜色必须是808080而不是3B3B3B为了使两个图像同样期待:

enter image description here

在你的情况,你可以使用下面的颜色对于顶点(至少,他们似乎这样在你的屏幕截图):

000000 top left 
3A3A3A top right + bottom left 
595959 bottom right 

所以他们不符合上面的要求,为3A3A3A不其他两个之间的平均值。


稍微不同的例子说明为什么你也许不只是想用.5的混合阿尔法值(这将导致平均值为其他两个顶点)。考虑非正方形的四,这样矩形,其使用的值.5用于两个其它角,其对应于808080灰色:

enter image description here

正如你可以看到,该梯度的方向不正交到我称之为两个“底角”之间的连接线(左上角 - 右下角)。现在让我们看看我从上面的方法产生:

enter image description here

它看起来更像是两个角之间的线性渐变,但在“世界空间”,而不是在“纹理空间”。你可能更喜欢两个输出中的一个输出;我想告诉你不同之处。在连接线(正交投影)的值如下所示

enter image description here

对不起,我的形象不好......(他们只是近似值!);)

+0

P.S.这同样适用于顶点坐标......考虑四边形(光栅平铺世界中的地砖),其中一个角高1,其他0。对角线决定了瓷砖的中心位于高度0还是0.5,就像一个示例性的点。这就是为什么我们通常在输入数据不明确的情况下避免使用四边形的原因。 – leemes

+0

谢谢你的回复。 因此,这似乎解决了问题。我现在明白我想做的事情是不可能的。因为没有办法让每个三角形都知道看起来像什么颜色。 那么问题的第二部分如何得到块状/条纹效果? – Andrew

+0

@Andrew Just在你的问题中添加了评论。看起来“抖动”,这应该给你的理论背景。你希望将浮点值映射到从0到1的255个离散步骤(在屏幕上构建图像);然而,你不应该在它们之间的一个阈值(这是显卡自动默认为你自己做的),而是根据像素坐标决定阈值。听起来很复杂,但带来不错的结果。 – leemes