Struct перемещает свой адрес памяти в OpenGL - PullRequest
0 голосов
/ 23 декабря 2019

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´s. Когда я запускаю код, который комментируется в main.c, OpenGL отображает прямоугольник. Но если я использую вместо этого мой заголовочный файл со структурой, он не будет работать. Я понял, что структура меняет адрес своей памяти. После printf () в initVertexBuffer () он выводит адрес памяти и значение «1». Но в bindVertexBuffer () он каждый раз выдает значение «0» вместо «1» и адрес памяти откладывается. Не могли бы вы помочь мне?

1 Ответ

0 голосов
/ 23 декабря 2019

Проблема с initVertexBuffer.

initVertexBuffer принимает адрес buffer1 из 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);

и т. Д.

...