2016-11-01 1 views
-1

ダイナミックメッシュクラスを作成したいのですが、頂点カラーを有効にするときに何か間違っている必要があります。 私の例では、2つのフラグメントシェーダーがあります(fragment.glsl-> solid red color/fragmentExp.glsl-> vertexColor)。次に、1つの三角形と1つの立方体の2つのプリミティブを作成し、このデータを2つのメッシュに入れます。OpenGLメッシュクラスVertexColor

ソリッドカラーフラグメントシェーダを使用して頂点カラーを設定しない場合、正常に動作します。 だから今のメッシュがそれらでvertexColorsを持っているとVertexColorのフラグメントシェーダを使用している:私は次の行を変更した場合、問題が表示されます

Program program; 
program.LoadShader("Vertex", GL_VERTEX_SHADER, "shaders/vertex.glsl"); 
program.LoadShader("Fragment", GL_FRAGMENT_SHADER, "shaders/fragment.glsl"); 
program.AttachToProgram(); 

Program programExp; 
programExp.LoadShader("Vertex", GL_VERTEX_SHADER, "shaders/vertex.glsl"); 
programExp.LoadShader("Fragment", GL_FRAGMENT_SHADER, "shaders/fragmentExp.glsl"); 
programExp.AttachToProgram(); 

GLfloat verticesTri[] = { 
    -0.1f, -0.5f, 0.0f, 
    -0.9f, -0.5f, 0.0f, 
    -0.5f, 0.5f, 0.0f 
}; 

GLfloat verticesCube[] = { 
    0.1f, -0.5f, 0.0f, 
    0.9f, -0.5f, 0.0f, 
    0.1f, 0.5f, 0.0f, 
    0.9f, 0.5f, 0.0f 
}; 

GLuint indicesTri[] = { 
    0, 1, 2 
}; 

GLuint indicesCube[] = { 
    0, 1, 2, 
    2, 3, 1 
}; 

GLfloat colorsTri[] = { 
    1.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 1.0f 
}; 

GLfloat colorsCube[] = { 
    1.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 
    1.0f, 1.0f, 1.0f 
}; 

Mesh tri(program.GetProgram()); 
tri.SetVertices(verticesTri, sizeof(verticesTri)); 
tri.SetIndices(indicesTri, sizeof(indicesTri)); 
//tri.SetColors(colorsTri, sizeof(colorsTri)); 
tri.Init(); 

Mesh cube(program.GetProgram()); 
cube.SetVertices(verticesCube, sizeof(verticesCube)); 
cube.SetIndices(indicesCube, sizeof(indicesCube)); 
//cube.SetColors(colorsCube, sizeof(colorsCube)); 
cube.Init(); 

while (!glfwWindowShouldClose(window)) 
{ 
    glfwPollEvents(); 

    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    tri.Draw(); 
    cube.Draw(); 

    glfwSwapBuffers(window); 
} 

は、ここに私の実施例です。

結果として私は黒い画面を得ました。 私は何が間違っていますか?それは...私のメッシュのクラスで何かを

Mesh tri(programExp.GetProgram()); 
tri.SetVertices(verticesTri, sizeof(verticesTri)); 
tri.SetIndices(indicesTri, sizeof(indicesTri)); 
tri.SetColors(colorsTri, sizeof(colorsTri)); 
tri.Init(); 

Mesh cube(programExp.GetProgram()); 
cube.SetVertices(verticesCube, sizeof(verticesCube)); 
cube.SetIndices(indicesCube, sizeof(indicesCube)); 
cube.SetColors(colorsCube, sizeof(colorsCube)); 
cube.Init(); 

そして最後に、私の一般的なメッシュのクラスを行いますがあります。ここでは

#include "header\mesh.h" 

Mesh::Mesh(GLuint program) 
{ 
    this->program = program; 

    glGenVertexArrays(1, &VAO); 
    glBindVertexArray(VAO); 
} 

Mesh::~Mesh() 
{ 
    glDeleteVertexArrays(1, &VAO); 

    glDeleteBuffers(1, &VBO); 
    glDeleteBuffers(1, &EBO); 
    glDeleteBuffers(1, &CBO); 
} 

void Mesh::SetVertices(GLfloat* vertices, unsigned long long size) 
{ 
    numVetices = size; 
    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW); 
} 

void Mesh::SetIndices(GLuint* indices, unsigned long long size) 
{ 
    numIndices = size; 
    glGenBuffers(1, &EBO); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, indices, GL_STATIC_DRAW); 
} 

void Mesh::SetColors(GLfloat* colors, unsigned long long size) 
{ 
    numColors = size; 
    glGenBuffers(1, &CBO); 
    glBindBuffer(GL_ARRAY_BUFFER, CBO); 
    glBufferData(GL_ARRAY_BUFFER, size, colors, GL_STATIC_DRAW); 
} 

void Mesh::Init() 
{ 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(0); 

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(1); 
} 

void Mesh::Draw() 
{ 
    glUseProgram(program); 

    glBindVertexArray(VAO); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
    //glDrawArrays(GL_TRIANGLES, 0, 6); 
    glBindVertexArray(0); 
} 

は、私の頂点シェーダと私のフラグメントシェーダです:

#version 400 

layout(location = 0) in vec3 pos; 
layout(location = 1) in vec3 col; 

out vec3 color; 

void main() 
{ 
    gl_Position = vec4(pos, 1.0); 
    color = col; 
}; 


#version 400 

in vec3 col; 

out vec3 color; 

void main() 
{ 
    color = col; 
}; 

答えて

0

glVertexAttribPointerは常に現在バインドされているGL_ARRAY_BUFFERで動作します。あなたのinit関数では、色がない場合はVBO、色がある場合はCBOです。これを解決するには、頂点属性を設定する前に正しいバッファをバインドする必要があります。 (カラーアトリビュートのバインディングは、色がある場合にのみ設定してください)。

void Mesh::Init() 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, CBO); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(1); 
}