c - 结构在OpenGL中移动他的内存地址
问题描述
主程序
#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”并且内存地址被推迟。请你帮助我好吗?
解决方案
问题出在initVertexBuffer
.
initVertexBuffer
取buffer1
from的地址main.c
。然后它从该地址读取 VertexBuffer 中的数据,并将其存储到局部变量中。然后它将vao
成员设置在该局部变量中。buffer1
在任何时候都不会被修改。
而不是这个:
// this line creates a new VertexBuffer and copies the data from the variable that bufferPtr points to.
struct VertexBuffer buffer = *bufferPtr;
// these lines access the new copy of the data, not the original.
glGenVertexArrays(1, &buffer.vao);
glBindVertexArray(buffer.vao);
用这个:
// these lines access the variable that bufferPtr points to.
glGenVertexArrays(1, &bufferPtr->vao);
glBindVertexArray(bufferPtr->vao);
等等。
推荐阅读
- php - 引导表延伸到容器之外
- c - Mqtt 消息未从 C 发布到 Siddhi
- laravel - 如何从 laravel 中的 url 获取语言环境?
- angular - Angular 服务无法读取 Slim REST API 链接
- sharepoint - 从 Outlook 365 插件访问 Sharepoint (sp.js)
- apache-nifi - Nifi Job 执行 spark 提交命令未给出正确结果
- javascript - 重新计算父高度的问题
- sql - Oracle 在实施 SQL Profile 后建议 TABLE ACCESS FULL
- python - Flask-WhooshAlchemy 引发 NameError:未定义名称“unicode”
- python - 掩码值如何影响 Keras 中的指标?