【问题标题】:Struct moves his memory address in OpenGL结构在OpenGL中移动他的内存地址
【发布时间】:2025-12-06 03:00:02
【问题描述】:

main.c

#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;
}

VertexBuffer.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”并且内存地址被推迟。你能帮帮我吗?

【问题讨论】:

  • "Struct 移动他的内存地址 [...]" - 不,它不会,请学习基础知识。这是一个非常基本的问题。 struct VertexBuffer buffer = *bufferPtr; 创建bufferPtr 引用的数据的本地副本。实际上你设置了局部变量buffer的元素,bufferPtr引用的结构永远不会改变。在函数initVertexBufferbindVertexBuffer 中删除struct VertexBuffer buffer = *bufferPtr; 行并使用bufferPtr-&gt; 代替buffer.

标签: c opengl struct glut glad


【解决方案1】:

问题在于initVertexBuffer

initVertexBuffermain.c 中获取buffer1 的地址。然后它从该地址的 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);

等等。

【讨论】: