OpenglES 2.0顶点着色器属性

问题描述 投票:2回答:3

我已经阅读了教程,下面定义了顶点着色器的最低要求:

attribute vec3 v3_variable;
attribute vec3 v3Pos;

void main()
{
    gl_Position = v3Pos;
}

OpenglES将着色器顶点数据传递到v3Pos,但此变量的名称实际上可以是任何东西,其他教程将其命名为a_Positiona_Pos,无论如何〜。

所以我的问题是,OpenglES如何知道当我调用glVertexAttribPointer()时它知道应该将数据放入v3Pos而不是v3_variable

c++ opengl-es shader vertex
3个回答
1
投票

有两种方法可以识别着色器中的哪些属性与提供给glVertexAttribPointer的数据“配对”。您通过glVertexAttribPointer获得的唯一标识符是index(第一个参数),因此必须以某种方式通过索引来完成。

在第一种方法中,使用glGetAttribLocation编译并链接了着色器后,从着色器中获取属性的索引,并将其用作第一个参数,例如。>

GLint program = ...;
GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos");
GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable");
glVertexAttribPointer(v3PosAttributeIndex, ...);
glVertexAttribPointer(v3varAttributeIndex, ...);

您还可以在编写着色器时显式设置属性的布局(如@ j-p的注释所示,因此您可以像这样修改着色器:

layout(location = 1) in vec3 v3_variable;
layout(location = 0) in vec3 v3Pos;

然后在代码中,您将对其进行显式设置:

glVertexAttribPointer(0, ...); // v3Pos data
glVertexAttribPointer(1, ...); // v3_variable data

此第二种方法仅在GLES 3.0+(和OpenGL 3.0+)中有效,因此,如果仅使用GLES 2.0,则可能不适用于您的情况。另外,请注意,您可以同时使用这两种方法。例如。即使您明确定义布局,也不会限制您以后查询它们。


1
投票

好的,因此在应用程序端,您会看到一个看起来像任何一个的电话


0
投票

关于OpenGL ES 2.0:在将它们在片段/几何着色器中引用之前,是否必须将所有属性(顶点/颜色/法线/ texcoords)都放在顶点着色器中,否则您无法列出其中一些顶点着色器中的属性(即颜色/ texcoords)并在以后引用它们(例如在片段着色器中)?

© www.soinside.com 2019 - 2024. All rights reserved.