2017-01-25 12 views
0

私は単に三角形を作成し、それを画面上に描画するOpenGLプログラムを作成しています。私は描画関数を含むDrawableというクラスと、使用されるVAO & VBOオブジェクトを作成しました。 Drawableクラスから継承するTriangleクラスも作成しました。 Triangleクラスでは、ポイントの配列と色を含む単一の配列を持つコンストラクタがあり、このデータを使用してVAO & VBO(Drawableから継承されます)を初期化します。私のTriangleオブジェクトが描画されないのはなぜですか?

私の主な機能では、ポイントと色のデータを使って三角形を初期化し、Triangleオブジェクトのdraw関数を呼び出します(この描画関数はDrawableにあります)。最終的にはウィンドウが開き、三角形は描画されません。 Drawableクラスに単純なコンストラクタがあり、このコンストラクタを使用してオブジェクトを初期化してdraw関数を呼び出すと、そのオブジェクトが表示されるので、私のdraw関数とは思えません。私が考えることができるのは、VAO & VBOオブジェクトにアクセスしている可能性があるため、実際には何も初期化されていない可能性がありますが、その確認方法はわかりません。

Drawable.h

class Drawable 
{ 
    public: 
     Drawable(); 

     void draw(); 
     GLuint objBuffer, VAO, program; 
     std::string vShaderName, fShaderName; 
     bool isUniform = false; 
     int numVertices = 0; 
     vec4 uniformColorVec; 
}; 

Drawable.cpp

Drawable::Drawable() 
{} 

void Drawable::draw() 
{ 
     GLuint program = InitShader(vShaderName.c_str(), fShaderName.c_str()); 
     glUseProgram(program); 
     GLuint color_loc = glGetUniformLocation(program, "color"); 

     glBindVertexArray(VAO); 

     glUniform4fv(color_loc, 1, uniformColorVec); 
     glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices); 

} 

Triangle.cpp

Triangle::Triangle(vec4 triPoints[3], vec4 color) 
{ 
    uniformColorVec = color; 

    vShaderName = "vshader00_v150.glsl"; 
    fShaderName = "fshader00_v150.glsl"; 
    numVertices = 3; 

    glGenVertexArrays(1, &VAO); 
    glBindVertexArray(VAO); 
    glGenBuffers(1, &objBuffer); 

    glBindBuffer(GL_ARRAY_BUFFER, objBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triPoints), triPoints, GL_STATIC_DRAW); 

    program = InitShader(vShaderName.c_str(), fShaderName.c_str()); 
    glUseProgram(program); 

    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    GLuint color_loc = glGetUniformLocation(program, "color"); 

    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    glUniform4fv(color_loc, 1, uniformColorVec); 

} 

メインファイル

/* All the OpenGL windowing is intialized but I won't 
    include that since I know it's fine due to other objects being drawn 
    correctly */ 


vec4 triPoints2[3] = { 
    vec4(0.0, 0.0, 1.0, 1.0), 
    vec4(-0.75, -0.75, 1.0, 1.0), 
    vec4(0.0, -0.75, 1.0, 1.0) 
}; 

vec4 blue_opaque = vec4(0.0, 0.0, 1.0, 1.0); 

Triangle t; 
t = Triangle(triPoints2, blue_opaque); 

glClearColor(1.0, 1.0, 1.0, 1.0); 

glClear(GL_COLOR_BUFFER_BIT); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_BLEND); 

t.draw(); 

glFlush(); 
+1

「glGetError」とは何ですか?また、 'GL_TRIANGLE_FAN'を使用することを薦めます。なぜなら、それは歴史なんだからです。 – ybungalobill

+0

@ybungalobill 'glGetError'は0を示しているので、エラーを報告していません。 – user3358152

+1

'Triangle t;を変更するとどうなりますか? t = Triangle(triPoints2、blue_opaque); 'Line to 'Triangle t(triPoints2、blue_opaque);'? – ybungalobill

答えて

2

関数の引数はvec4 triPoints[3]ですが、C++の規則では、関数の引数としてvec4 *triPointsと等価です。その結果、sizeof(triPoints)はデータのサイズではなく、ポインタ自体のサイズ(4または8のいずれか)です。代わりに、次のように変更してください:

glBufferData(GL_ARRAY_BUFFER, sizeof(*triPoints)*numVertices, triPoints, GL_STATIC_DRAW); 
+0

ありがとうございました!私は本当にあなたの助けに感謝します。 – user3358152

関連する問題