着色器创建弯曲的纹理

Shaders create curved texture

我想创建一个半圆形的矩形,当我向这个形状添加纹理时,它会有弯曲的纹理。我创建了一个简单的矩形,它看起来像下图(如果我们从高处看,它就形成了):

并且通过顶点着色器我试图弯曲这个形状。我试着创造这个形状

我使用了这个顶点着色器

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坐标有任何变化,也没有看到形状有任何角度。有人可以说我做错了什么吗?

您误解了顶点着色器在渲染管线中的作用。顾名思义,顶点着色器为每个输入顶点执行一次。在你的例子中,你有 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;