gpt4 book ai didi

c++ - 树莓派上的 openGL,索引顶点

转载 作者:太空宇宙 更新时间:2023-11-04 10:35:38 24 4
gpt4 key购买 nike

我正在尝试在树莓派上学习一些基本的 opengl。我遵循这些教程 https://solarianprogrammer.com/2013/05/13/opengl-101-drawing-primitives/ http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/

我遇到了一个我无法解决的问题。我通过在数组中列出顶点成功地绘制了一个三角形,然后我尝试做同样的事情但是使用索引,它不起作用而且我不知道为什么。它编译成功并运行,但不显示三角形。

两个教程都让它变得如此简单,添加一个缓冲区并将“glDrawArrays”替换为“glDrawElements”。但我一定错过了什么..

#include <stdio.h>
#include <unistd.h>
#include "../common/startScreen.h"
#include "../common/LoadShaders.h"

// Include GLM
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

using namespace glm;

int main(int argc, const char **argv)
{
float r=0.0;
InitGraphics();
printf("Screen started\n");
// Create and compile our GLSL program from the shaders
GLuint programID = LoadShaders( "simpletransformvertshader.glsl", "simplefragshader.glsl" );
printf("Shaders loaded\n");

// Get a handle for our "MVP" uniform
GLuint MatrixID = glGetUniformLocation(programID, "MVP");

// Get a handle for our buffers
GLuint vertexPosition_modelspaceID = glGetAttribLocation(programID, "vertexPosition_modelspace");

// Projection matrix
glm::mat4 Projection = glm::perspective(45.0f, 16.0f / 9.0f, 0.1f, 100.0f);



// Camera matrix
glm::mat4 View = glm::lookAt(
glm::vec3(0,0,5),
glm::vec3(0,0,0),
glm::vec3(0,1,0),
);

//glm::mat4 myMatrix = glm::translate(10.0f, 0.0f, 0.0f);

// Model matrix : an identity matrix (model will be at the origin)
glm::mat4 Model = glm::mat4(1.0f);
// Our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 MVP = Projection * View * Model; // Remember, matrix$

//glm:mat4 MVP = Prpkection * View * Model;

GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
// -1.0, 1.0f, 0.0f,
};



GLuint indices[3] = {
0,1,2,
// 2,3,0
};



// Set the viewport

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_bu$


GLuint eab;
glGenBuffers(1, &eab);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eab);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STAT$



do{
// Model = glm::rotate(Model, r, glm::vec3(0.0f, 0.0f, 1.0f));

glClear( GL_COLOR_BUFFER_BIT );

// Use our shader
glUseProgram(programID);

// Send our transformation to the currently bound shader,
// in the "MVP" uniform
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

// 1rst attribute buffer : vertices
glEnableVertexAttribArray(vertexPosition_modelspaceID);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);


glVertexAttribPointer(
vertexPosition_modelspaceID,

3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);

// see above glEnableVertexAttribArray(vertexPosition_modelspaceID);

// Draw the triangle !
// glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eab);
glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);




glDisableVertexAttribArray(vertexPosition_modelspaceID);

updateScreen();
}
while(1);

// Cleanup VBO
glDeleteBuffers(1, &vertexbuffer);
glDeleteBuffers(1, &eab);
glDeleteProgram(programID);


}

最佳答案

GLES 1.x/2.x 默认不支持 32 位索引。您最多可以使用 16 位索引,因此您应该将代码更改为:

GLushort indices[3] = {...}
[...]
glDrawElements(..., 3, GL_UNSIGNED_SHORT, ...);

请注意,尝试在不支持 GL_OES_element_index_uint 的实现中使用 GL_UNSIGNED_INT 作为类型参数应该只会导致 GL_INVALID_ENUM 错误。您至少应该为调试添加一些错误检查。

关于c++ - 树莓派上的 openGL,索引顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com