当前位置: 首页 > 知识库问答 >
问题:

顶点缓冲区数据到数组顶点数据流

郏景澄
2023-03-14

下面的lwjgl3代码设置缓冲区等,用于呈现三角形。我能看到三角形。现在我正努力弄明白到底是怎么回事。

下面是我对代码的理解。我们首先创建一个顶点缓冲区对象,它只是一个数组的容器。glBindBuffer()和glBufferData()使用顶点数组填充顶点缓冲区对象。我们再次对第二个顶点数组执行此操作。然后我们编译顶点和片段着色器,并将它们添加到着色器程序中。不知怎么的,这个程序访问第二个顶点缓冲区对象中的数据。

然后我们绑定一个顶点数组对象。我们用着色程序的输出填充它,它处理了来自第二个顶点缓冲区对象的顶点数据。

问题

看起来这个设置是允许多个顶点数据由同一组命令处理。我将在代码末尾放置哪些命令来传递第一个顶点数据,而不是第二个顶点数据。我是否必须为每个顶点缓冲区对象创建一个单独的顶点数组对象,或者我可以向管道下发送不同的缓冲区并保持相同的顶点数组对象?

代码

下面是我在上面引用的代码:首先,变量是:

//The vertices of a triangle
float[] vertices = new float[] {
        0.0f, 0.5f,
        0.5f, -0.5f,
        -0.5f, -0.5f
};

//Vertices of the second triangle
float[] vertices2 = new float[] {
        0.0f, 0.9f,
        0.5f, -0.5f,
        -0.5f, -0.5f
};

//The source for the vertex shader
String vertexShaderSrc =
        "#version 300 es\n\n" +
        "precision mediump float;\n" +
        "in vec2 position;\n\n" +
        "void main()\n" +
        "{\n" +
            "gl_Position = vec4(position, 0.0, 1.0);\n" +
        "}";

int vertexShader;

//The source for the fragment shader
String fragmentShaderSrc =
        "#version 300 es\n\n" +
        "precision mediump float;\n" +
        "out vec4 outColor;\n\n" +
        "void main()\n" +
        "{\n" +
            "outColor = vec4(1.0, 1.0, 1.0, 1.0);\n" +
        "}";
int fragmentShader;
int shaderProgram;
//The position attribute
int posAttrib;

//A vertex buffer object handle.
int vbo;

//A second vertex buffer object handle.
int vbo2;

//A vertex array object handle.
int vao;

使用它们的代码段是:

vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);

vbo2 = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, vertices2, GL_STATIC_DRAW);


vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, vertexShaderSrc);
glCompileShader(vertexShader);

System.out.println(glGetShaderInfoLog(vertexShader));

fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, fragmentShaderSrc);
glCompileShader(fragmentShader);

System.out.println(glGetShaderInfoLog(fragmentShader));

shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);

vao = glGenVertexArrays();
glBindVertexArray(vao);

posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(posAttrib);

共有1个答案

司空赞
2023-03-14

“看起来这个设置是允许多个顶点数据由同一组命令处理”--是的,您可以通过添加更多包含顶点位置、纹理坐标、顶点颜色等数据的顶点缓冲区对象,对顶点数组对象进行一次渲染调用。如果你想像位置一样改变发送到着色器的顶点数据,你可以使用一个作为统一传递的变换矩阵来移动、缩放和旋转对象。但是,如果对象是不同的模型,那么您应该使用不同的VAO。

 类似资料:
  • 我正在努力学习LWJGL (OpenGL)不得不说我很艰难。 我试着在窗户上画一个三角形和一个四边形,最后我设法做到了。 但我还有一个问题 如果您觉得这个问题很愚蠢,请提前表示歉意,但我在网上找不到非常详细的教程,所以很难理解,因为这是我第一次使用OpenGL。 话虽如此,这是代码的相关部分: 假设程序以60 fps的速度运行。< br >这意味着渲染方法每秒钟被游戏循环调用60次。 该渲染方法的

  • 我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个? null

  • 通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。 比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的

  • 2.1节~2.4节通过缓冲类型几何体BufferGeometry给大家讲解了顶点位置、颜色、法向量、索引数据,本节课给大家引入一个新的threejs几何体APIGeometry。几何体Geometry和缓冲类型几何体BufferGeometry表达的含义相同,只是对象的结构不同,Threejs渲染的时候会先把Geometry转化为BufferGeometry再解析几何体顶点数据进行渲染。 Vect

  • 我目前正在使用LWJGL / OpenGL创建一个2D,自上而下的游戏,但是在绘制实体之后,在使用顶点缓冲区对象渲染实体后,在让它们四处移动的过程中,我遇到了一些问题。这是渲染线程的 run() 方法,以及设置方法: 实体从抽象超类继承这些方法来设置 VBO 并绘制实体(呈现线程中的 drawEntities 方法仅调用该方法,实体更新方法(见下文),而 setUpEntities 调用 setU

  • 我正在尝试从ArrayList读取并创建VBO,然后对其进行渲染。问题是我只是渲染了一个空白屏幕。当我立即渲染时,一切都很好;只有现在VBO的才不起作用。 游戏循环如下所示,相机调用glTranslate和glRotate函数。 渲染方法: 阵列列表具有顶点和链接的颜色。每个体素将其顶点添加到ArrayList(而不是立即渲染)。