Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 着色器创建弯曲纹理_Opengl_Opengl Es_Glsl_Shader - Fatal编程技术网

Opengl 着色器创建弯曲纹理

Opengl 着色器创建弯曲纹理,opengl,opengl-es,glsl,shader,Opengl,Opengl Es,Glsl,Shader,我想创建一个半圆形状的矩形,当我向这个形状添加纹理时,它会有弯曲的纹理。我创建了一个简单的矩形,它看起来像下面的图片(如果我们从高处看的话,它的形状是正确的): 通过顶点着色器,我尝试弯曲这个形状。我试着创造这个形状 我用了这个顶点着色器 attribute vec4 vPosition; attribute vec4 vTexCoordinate; uniform mat4 u_MVP; uniform mat4 textureTransform; varying vec2 v_TexCo

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

通过顶点着色器,我尝试弯曲这个形状。我试着创造这个形状

我用了这个顶点着色器

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次

顶点着色器的输出值(
variable
variables)然后跨三角形插值,这些插值成为片段着色器的匹配输入

如果要在顶点着色器中变形几何体,最直接的方法是指定更多顶点。可以将四边形细分为顶点网格。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;

你的方法没有道理。顶点着色器对顶点进行操作。无论如何移动顶点,三角形在平面中始终保持平面。在你的例子中,你只有x=-100或x=100,所以你的z坐标永远是0。是的,谢谢。我错了。我将尝试在中心再添加一个顶点,并通过z坐标对其进行更改