2015-05-08 57 views
2

我想创建矩形,它将呈半圆形状,并且当我将纹理添加到此窗体时,它将具有弯曲的纹理。我创建了一个简单的矩形,它看起来像下面的图像(如果我们从高度来看,它的形式就是这样): enter image description here着色器创建曲线纹理

而且通过顶点着色器,我尝试曲线形状。我试图创建这种形状 enter image description here

而且我用这个顶点着色器

attribute vec4 vPosition; 
attribute vec4 vTexCoordinate; 
uniform mat4 u_MVP; 
uniform mat4 textureTransform; 
varying vec2 v_TexCoordinate; 
void main() { 
    v_TexCoordinate = (textureTransform * vTexCoordinate).xy; 
    vec4 try = vPosition; 
    if(try.x > 0.0 ){ 
     try[2] = try.x - 100.0; 
    } else { 
     try[2] = 100.0 - try.x ; 
    } 
    gl_Position = u_MVP * try; 
} 

,但我没有看到Z中的任何改变的坐标,并没有看到形状任意角度。有人可以说我做错了什么吗?

+1

你的做法是没有意义的。顶点着色器在顶点上操作。无论您如何移动顶点,三角形都会始终保持平面。在你的情况下,你只有x = -100或x = 100,所以你的z坐标总是0. – derhass

回答

3

您误解了顶点着色器在渲染管线中的角色。顾名思义,顶点着色器对每个输入顶点执行一次。在你的情况下,你有4个顶点定义你的四边形,所以顶点着色器将只执行4次。或者可能是6次,如果您指定两个三角形共享的顶点两次。

然后顶点着色器(varying变量)的输出值在三角形内插,并且这些内插值成为片段着色器的匹配输入。

如果要在顶点着色器中变形几何体,最直接的方法是指定更多顶点。您可以将四边形细分为顶点网格。一个3x3细分会看起来是这样的:

___________ 
|\ |\ |\ | 
| \ | \ | \ | 
|__\|__\|__\| 
|\ |\ |\ | 
| \ | \ | \ | 
|__\|__\|__\| 
|\ |\ |\ | 
| \ | \ | \ | 
|__\|__\|__\| 

这仅仅是为了说明,在现实中,你很可能需要更细的细分取决于你想要达到的曲率,以及有多大的最终渲染是。

为此计算顶点坐标是微不足道的。它们只是整个四分之一范围的一小部分,它们都在同一个平面上。

使用相对较新版本的桌面OpenGL,您可以使用镶嵌细化着色器生成内部顶点,同时仍然只指定4个原始顶点。但镶嵌着色器仅作为OpenGL ES中的扩展使用,尚未得到广泛支持。

如果我正确理解你的绘图,我认为你的计算也有一个小错误。我认为应该是这样的:

if(try.x > 0.0 ) { 
    try[2] = try.x - 100.0; 
} else { 
    try[2] = -try.x - 100.0; 
} 

或更容易:

try[2] = abs(try.x) - 100.0; 
+0

是的,谢谢。我错了。我会尝试在中心再添加一个顶点,并通过z坐标来更改它 – Dima