2016-11-02 6 views
0

Я пытаюсь сделать простой прямоугольник в моей игре, но я продолжать работать в следующий перерыв: enter image description hereОшибка при попытке использовать glDrawArrays в C++

Вот код в моем Sprite.cpp где я связываю и делать вещи.

void Sprite::init(float x, float y, float width, float height){ 

this->x = x; 
this->y = y; 
this->width = width; 
this->height = height; 


if(vbo == 0) 
    glGenBuffers(1, &vbo); 

Vertex vertex[6]; 

vertex[0].setPosition(x, y); 
vertex[0].setUV(0, 0); 

vertex[1].setPosition(x, y + height); 
vertex[1].setUV(0, 1); 

vertex[2].setPosition(x + width, y + height); 
vertex[2].setUV(1, 1); 


vertex[3].setPosition(x, y); 
vertex[3].setUV(0, 0); 

vertex[4].setPosition(x + width, y); 
vertex[4].setUV(1, 0); 

vertex[5].setPosition(x + width, y + height); 
vertex[5].setUV(1, 1); 

for (int i = 0; i < 6; i++) 
    vertex[i].setColor(0.0, 0.0, 1.0, 1.0); 

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(vbo, sizeof(vertex), vertex, GL_DYNAMIC_DRAW); 


glBindBuffer(GL_ARRAY_BUFFER, 0); 

} 



void Sprite::render(){ 

glBindBuffer(GL_ARRAY_BUFFER, vbo); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position)); 
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (void*)offsetof(Vertex, color)); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, uv)); 

glDrawArrays(GL_TRIANGLES, 0, 6); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
glDisableVertexAttribArray(2); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

} 

Если я закомментируйте строки "glDrawArrays (GL_TRIANGLES, 0, 6)" Тогда программа будет работать прекрасно. Вот моя структура Vertex для дополнительной информации:

#pragma once 
#include <GL\glew.h> 



struct Position { 

float x, y; 

}; 


struct UV{ 

float u, v; 

}; 

struct Color { 

GLubyte r, g, b, a; 
}; 



struct Vertex { 


Position position; 

Color color; 

UV uv; 


void setUV(float u, float v) { 
    uv.u = u; 
    uv.v = v; 
} 

void setColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a) { 
    color.r = r; 
    color.g = g; 
    color.b = b; 
    color.a = a; 
} 

void setPosition(float x, float y) { 
    position.x = x; 
    position.y = y; 
} 
}; 

Я просто серьезно не знаю, почему это происходит. Я слышал, что эта ошибка связана с де-ссылкой на какой-то нулевой указатель или что-то в этом роде. Я просто не знаю, как решить эту проблему. Любая помощь чрезвычайно ценится.

ответ

3

это: glBufferData(vbo, sizeof(vertex), vertex, GL_DYNAMIC_DRAW);

должно быть: glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);

, потому что первый аргумент определяет, как следует использовать ваш массив.

+0

Я ненавижу себя прямо сейчас ... Большое вам спасибо. Думаю, с тех пор, как я так долго работал над этим, мне просто нужны были свежие глаза. Спасибо! – Luke

+1

Lol ikr, мы все сделали и по-прежнему делаем ту же ошибку в какой-то момент! Приветствия. –

Смежные вопросы