2017-04-20 20 views
-1

によってピックアップされないので、私の頂点シェーダは3つのglm :: mat4オブジェクトを取り、正しい位置にレンダリングします。私はそれぞれのモデルを描画していましたが、各描画は一様な行列を渡していましたが、ドローコールの量がフレームレートを遅くし始めていました。だから私は3 matrix4 vboを使用するように変更しました。すべてがコンパイルされ、オブジェクトの一部が見えますが、マトリックスがシェーダに伝播していません。私は誰でもできるなら、これについていくつかの助けが好きです。次のように私のコードはMatrix VBOは頂点シェーダ

static enum BUFFERS { 
     VERTEX_BUFFER, TEXCOORD_BUFFER, NORMAL_BUFFER, INDEX_BUFFER, 
     MVP_MAT_VB, MODELVIEW_MAT_VB, NORMAL_MAT_VB 
    }; 
#define POSITION_LOCATION 0 
#define TEX_COORD_LOCATION 1 
#define NORMAL_LOCATION 2 
#define MVP_LOCATION 3 
#define MODEL_VIEW_LOCATION 7 
#define NORMAL_MATRIX_LOCATION 11 

作成インスタンスが

MeshEntry::MeshEntry(aiMesh *mesh) { 
    vbo[VERTEX_BUFFER] = NULL; 
vbo[TEXCOORD_BUFFER] = NULL; 
vbo[NORMAL_BUFFER] = NULL; 
vbo[INDEX_BUFFER] = NULL; 
vbo[MODELVIEW_MAT_VB] = NULL; 
vbo[MVP_MAT_VB] = NULL; 
vbo[NORMAL_MAT_VB] = NULL; 

glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

elementCount = mesh->mNumFaces * 3; 

if (mesh->HasPositions()) { 
    float *vertices = new float[mesh->mNumVertices * 3]; 
    for (int i = 0; i < mesh->mNumVertices; ++i) { 
     vertices[i * 3] = mesh->mVertices[i].x; 
     vertices[i * 3 + 1] = mesh->mVertices[i].y; 
     vertices[i * 3 + 2] = mesh->mVertices[i].z; 
    } 

    glGenBuffers(1, &vbo[VERTEX_BUFFER]); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]); 
    glBufferData(GL_ARRAY_BUFFER, 3 * mesh->mNumVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
    glEnableVertexAttribArray(0); 

    delete vertices; 
} 


if (mesh->HasTextureCoords(0)) { 
    float *texCoords = new float[mesh->mNumVertices * 2]; 
    for (int i = 0; i < mesh->mNumVertices; ++i) { 
     texCoords[i * 2] = mesh->mTextureCoords[0][i].x; 
     texCoords[i * 2 + 1] = mesh->mTextureCoords[0][i].y; 
    } 

    glGenBuffers(1, &vbo[TEXCOORD_BUFFER]); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER]); 
    glBufferData(GL_ARRAY_BUFFER, 2 * mesh->mNumVertices * sizeof(GLfloat), texCoords, GL_STATIC_DRAW); 

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
    glEnableVertexAttribArray(1); 

    delete texCoords; 
} 


if (mesh->HasNormals()) { 
    float *normals = new float[mesh->mNumVertices * 3]; 
    for (int i = 0; i < mesh->mNumVertices; ++i) { 
     normals[i * 3] = mesh->mNormals[i].x; 
     normals[i * 3 + 1] = mesh->mNormals[i].y; 
     normals[i * 3 + 2] = mesh->mNormals[i].z; 
    } 

    glGenBuffers(1, &vbo[NORMAL_BUFFER]); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER]); 
    glBufferData(GL_ARRAY_BUFFER, 3 * mesh->mNumVertices * sizeof(GLfloat), normals, GL_STATIC_DRAW); 

    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
    glEnableVertexAttribArray(2); 

    delete normals; 
} 


if (mesh->HasFaces()) { 
    unsigned int *indices = new unsigned int[mesh->mNumFaces * 3]; 
    for (int i = 0; i < mesh->mNumFaces; ++i) { 
     indices[i * 3] = mesh->mFaces[i].mIndices[0]; 
     indices[i * 3 + 1] = mesh->mFaces[i].mIndices[1]; 
     indices[i * 3 + 2] = mesh->mFaces[i].mIndices[2]; 
    } 

    glGenBuffers(1, &vbo[INDEX_BUFFER]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * mesh->mNumFaces * sizeof(GLuint), indices, GL_STATIC_DRAW); 

    delete indices; 
} 


glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

glGenBuffers(1, &vbo[MVP_LOCATION]); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[MVP_LOCATION]); 
for (unsigned int i = 0; i < 4; i++) { 
    glEnableVertexAttribArray(MVP_LOCATION + i); 
    glVertexAttribPointer(MVP_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4)); 
    glVertexAttribDivisor(MVP_LOCATION + i, 1); 
} 

glGenBuffers(1, &vbo[MODELVIEW_MAT_VB]); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[MODEL_VIEW_LOCATION]); 
for (unsigned int i = 0; i < 4; i++) { 
    glEnableVertexAttribArray(MODEL_VIEW_LOCATION + i); 
    glVertexAttribPointer(MODEL_VIEW_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4)); 
    glVertexAttribDivisor(MODEL_VIEW_LOCATION + i, 1); 
} 

glGenBuffers(1, &vbo[NORMAL_MAT_VB]); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_MATRIX_LOCATION]); 
for (unsigned int i = 0; i < 4; i++) { 
    glEnableVertexAttribArray(NORMAL_MATRIX_LOCATION + i); 
    glVertexAttribPointer(NORMAL_MATRIX_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4)); 
    glVertexAttribDivisor(NORMAL_MATRIX_LOCATION + i, 1); 
} 

インスタンス化されたレンダリング

void MeshEntry::renderInstanced(std::vector<glm::mat4> mvps, 
std::vector<glm::mat4> modelViews, std::vector<glm::mat4> normalMats) 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, vbo[MVP_MAT_VB]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * mvps.size(), &mvps[0] 
    [0], GL_DYNAMIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[MODELVIEW_MAT_VB]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * mvps.size(), 
    &modelViews[0][0], GL_DYNAMIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_MAT_VB]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * mvps.size(), 
    &normalMats[0][0], GL_DYNAMIC_DRAW); 

    glBindVertexArray(vao); 

    glDrawElementsInstanced(GL_TRIANGLES, elementCount, GL_UNSIGNED_INT, 
    NULL, mvps.size()); 

    // Make sure the VAO is not changed from the outside  
    glBindVertexArray(0); 
} 

バーテックスシェーダ

#version 430 core 

layout (location = 0) in vec3 VertexPosition; 
layout (location = 1) in vec2 VertexTex; 
layout (location = 2) in vec3 VertexNormal; 

layout (location = 3) in mat4 MVP;             

layout (location = 7) in mat4 ModelViewMatrix; 
layout (location = 11) in mat4 NormalMatrix; 

out Data 
{ 
    vec3 Position; 
    vec3 Normal; 
    vec2 TexCoord; 
} data; 


void main() 
{ 
    data.Normal = normalize(NormalMatrix * vec4(VertexNormal, 0)).xyz; 
    data.Position = vec3(ModelViewMatrix * vec4(VertexPosition, 1)); 
    data.TexCoord = VertexTex; 

    gl_Position = MVP * vec4(VertexPosition, 1); 
    gl_Position = vec4(VertexPosition, 1); 
} 
をvbos定数であり、

VBOで行列を貼り付け始める前に、このコードはうまくいきましたので、入力はうまくいくことが保証されています。 先週オープンしたばかりのopenglに取り組み始めましたので、関係するかもしれないすべてのコードを投稿してくれたことを許してください。正直なところ、何が間違っているのか分かりません。

ご協力いただきありがとうございます。

+1

スニペットあなたが働いていた元のコードの保存されたバージョンを持っていなければなりませんか?これと行ごとに比較するのは良いことです。 – Xirema

+0

私は新しい情報を持っているので質問を更新しました、オブジェクトは描画していましたが、MVPマトリックスはカメラの動きで更新されていませんでした。私の新しいコードと私の古いコードの唯一の違いは、glUniformMatrix4fv()を使って行列1を渡していて、DrawElementsInstancedの代わりにDrawElements関数を呼び出すことでした。 – gdxn96

答えて

0

「vbo」配列のインデックスとして間違った変数を使用すると、私の代わりに単純なエラーが発生しました。

glGenBuffers(1, &vbo[MVP_LOCATION]); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[MVP_LOCATION]); 
for (unsigned int i = 0; i < 4; i++) { 
    glEnableVertexAttribArray(MVP_LOCATION + i); 
    glVertexAttribPointer(MVP_LOCATION + i, 4, GL_FLOAT, GL_FALSE, 
sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4)); 
    glVertexAttribDivisor(MVP_LOCATION + i, 1); 
} 

glGenBuffers(1, &vbo[MVP_MAT_VB]); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[MVP_MAT_VB]); 
for (unsigned int i = 0; i < 4; i++) { 
    glEnableVertexAttribArray(MVP_LOCATION + i); 
    glVertexAttribPointer(MVP_LOCATION + i, 4, GL_FLOAT, GL_FALSE, 
sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4)); 
    glVertexAttribDivisor(MVP_LOCATION + i, 1); 
} 

お知らせそれぞれの第一及び第二のラインが

0

変化に:

layout(location =10)uniform mat4 .. ; 

(これは330.Thereが

#extension GL_ARB_explicit_uniform_location : enable 

その原料を必要とし、ほとんどのOpenGL 3.3のカードはそれを拒否しますと言うと430のシェーダで実行されますがありません。)

関連する問題