我正在尝试在OpenGL中呈现std::vector<Triangle*>
。我的矢量定义为:
#pragma once
#include <glm\glm.hpp>
struct Triangle
{
glm::vec3 _vertex0, _vertex1, _vertex2;
Triangle(glm::vec3 vertex0, glm::vec3 vertex1, glm::vec3 vertex2)
{
_vertex0 = vertex0;
_vertex1 = vertex1;
_vertex2 = vertex2;
}
Triangle(glm::vec4 vertex0, glm::vec4 vertex1, glm::vec4 vertex2)
{
_vertex0 = glm::vec3(vertex0.x, vertex0.y, vertex0.z);
_vertex1 = glm::vec3(vertex1.x, vertex1.y, vertex1.z);
_vertex2 = glm::vec3(vertex2.x, vertex2.y, vertex2.z);
}
};
我的Asset struct
是:
struct Asset
{
Asset() { }
Asset(std::string assetOBJFile)
{
glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);
programID = LoadShaders("vertexShader.txt", "fragmentShader.txt");
// Read our .obj file
loadOBJ(assetOBJFile.c_str(), originalTriangles, vertices, faces);
boundingSphere = BoundingSphere(vertices);
// Load it into a VBO
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, originalTriangles.size() * sizeof(Triangle), &originalTriangles[0], GL_STATIC_DRAW);
//velocity = glm::vec3(0.0, 1.0, 1.0);
velocity = glm::vec3(0.0, 0.0, 0.0);
position = glm::vec3(0.0, 0.0, 0.0);
lastTime = glfwGetTime();
}
GLuint vertexArrayID;
GLuint programID;
GLuint vertexbuffer;
std::vector<GLuint> faces;
std::vector<glm::vec3> vertices;
std::vector<Triangle*> originalTriangles;
std::vector<Triangle*> triangles;
BoundingSphere boundingSphere;
glm::vec3 velocity;
double lastTime;
glm::vec3 position;
};
我的渲染资产的代码是:
void renderAsset(Asset asset)
{
glUseProgram(asset.programID);
GLuint cameraID = glGetUniformLocation(asset.programID, "camera");
glUniformMatrix4fv(cameraID, 1, GL_FALSE, &camera[0][0]);
GLuint positionID = glGetUniformLocation(asset.programID, "position");
glUniformMatrix4fv(positionID, 1, GL_FALSE, &glm::translate(glm::mat4(), asset.position)[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, asset.vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, asset.originalTriangles.size()* 9);
glDisableVertexAttribArray(0);
}
然而,当我尝试渲染资产时,我最终在屏幕上出现了一堆乱码。如果我将Triangle*
的向量更改为Triangle
,一切都会很好,但我需要指针来构造我的空间哈希。
答案 0 :(得分:2)
您需要展平三角形矢量。您现在传递一个指向glBufferData的指针数组,而不是您想要的实际数据。
Triangle flattenedTriangles[] = new Triangle[ originalTriangles.size() ];
for(int i = 0; i<originalTriangles.size(); i++){
flattenedTriangles[i] = *(originalTriangles[i]);
}
glBufferData(GL_ARRAY_BUFFER, originalTriangles.size() * sizeof(Triangle), &flattenedTriangles[0], GL_STATIC_DRAW);
delete[] flattenedTriangles;
或者如果您不想分配数组而是映射缓冲区并构建到位:
glBufferData(GL_ARRAY_BUFFER, originalTriangles.size() * sizeof(Triangle), 0, GL_STATIC_DRAW);//allocate
do{
Triangle *flattenedTriangles = (flattenedTriangles*)glMapBuffer(GL_ARRAY_BUFFER,GL_WRITE_ONLY);
for(int i = 0; i<originalTriangles.size(); i++){
flattenedTriangles[i] = *(originalTriangles[i]);
}
}while(glUnmapBuffer(GL_ARRAY_BUFFER));//repeat if map got invalidated