主程序
#define APIENTRY __stdcall
#include<glad/glad.h>
#include <GL/glut.h>
#include <stdio.h>
#include "VertexBuffer.h"
//GLuint bufferID;
//GLuint vao;
struct VertexBuffer buffer1;
struct VertexBuffer *buffer1Ptr;
void display(void)
{
glClearColor(0,1.0,1.0,0);
glClear(GL_COLOR_BUFFER_BIT); //Löscht Bild aus Speicher
bindVertexBuffer(&buffer1);
//glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES,0, 3); //Modus, start, anzahl
unbindVertexBuffer();
glFlush(); //Gibt dem Bildschirm das Bild
}
void keyboard(unsigned char key, int x, int y)
{
if(key == 27) //Wenn Escape schließen
{
exit(0);
}
}
void reshape(int width, int height)
{
}
int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutInitWindowSize(500, 500);
glutInitWindowPosition(183,100);
glutCreateWindow("TestApp");
glutDisplayFunc(display); //display func initialisieren
glutKeyboardFunc(keyboard); //keyboard func initialisieren
glutReshapeFunc(reshape);
gladLoadGL();
//Initialize the triangle-------------------------
struct Vertex verticies[3];
verticies[0].x = -0.5;
verticies[0].y = -0.5;
verticies[0].z = 0;
verticies[1].x = 0;
verticies[1].y = 0.5;
verticies[1].z = 0;
verticies[2].x = 0.5;
verticies[2].y = -0.5;
verticies[2].z = 0;
uint32_t numVerticies = 3;
//-------------------------------------------------
buffer1.data = verticies;
buffer1.numVerticies = numVerticies;
initVertexBuffer(&buffer1);
//glGenVertexArrays(1, &vao);
//glBindVertexArray(vao);
// glGenBuffers(1, &bufferID);
// glBindBuffer(GL_ARRAY_BUFFER, bufferID);
// glBufferData(GL_ARRAY_BUFFER, numVerticies * sizeof(struct Vertex), verticies, GL_STATIC_DRAW);
// glEnableVertexAttribArray(0);
//glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), 0);
//glBindVertexArray(0);
//LOOP starts
glutMainLoop();
return 0;
}
顶点缓冲区.h
#include<glad/glad.h>
struct Vertex
{
float x;
float y;
float z;
};
struct VertexBuffer
{
//Parameter
void* data;
uint32_t numVerticies;
GLuint bufferID;
GLuint vao;
};
void initVertexBuffer(struct VertexBuffer *bufferPtr)
{
struct VertexBuffer buffer = *bufferPtr;
glGenVertexArrays(1, &buffer.vao);
glBindVertexArray(buffer.vao);
glGenBuffers(1, &buffer.bufferID);
glBindBuffer(GL_ARRAY_BUFFER, buffer.bufferID);
glBufferData(GL_ARRAY_BUFFER, buffer.numVerticies * sizeof(struct Vertex), buffer.data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), 0);
glBindVertexArray(0);
printf("%p\n", &(buffer.vao));
printf("%p\n", buffer.vao);
}
void bindVertexBuffer(struct VertexBuffer *bufferPtr)
{
struct VertexBuffer buffer = *bufferPtr;
glBindVertexArray(buffer.vao);
printf("%p\n", &buffer.vao);
printf("%p\n", buffer.vao);
}
void unbindVertexBuffer()
{
glBindVertexArray(0);
}
我想使用 vao 渲染一个矩形。当我运行 main.c 中注释的代码时,OpenGL 会渲染矩形。但是,如果我将头文件与结构一起使用,则它不起作用。我发现 Struct 改变了他的内存地址。在 initVertexBuffer() 中的 printf() 之后,它输出内存地址和值“1”。但是在 bindVertexBuffer() 中,它每次输出值“0”而不是“1”并且内存地址被推迟。请你帮助我好吗?