2017-12-09 7 views
1

他のオブジェクトに展開できる四面体をレンダリングしようとしています。 静的配列を使用すると、四面体が描画されます。
しかし、私はオフファイルを動的配列に読み込んだときに何も表示されません。コンパイル時にエラーは表示されません。glDrawArraysは動作しません。動的配列を描画します

GLfloat *tetra_vertices = NULL; //This is declared at the start 

以下は、オフファイルのデータを取得する関数で使用されます。 mod-> facesはOFFファイルから面の数を取得します。この場合は4です。 オフファイルの頂点の読み込みを確認したところ、それは正確です。それを静的配列と比較しても。

のinitで
tetra_vertices = (GLfloat *)malloc(sizeof(GLfloat) * mod->faces * 3 * 3); 

for(i=0; i< (mod->faces * 3); i++){ 
     tetra_vertices[i*3]=mod->verts[(mod->face[i])*3]; 
     tetra_vertices[i*3+1]=mod->verts[(mod->face[i])*3+1]; 
     tetra_vertices[i*3+2]=mod->verts[(mod->face[i])*3+2]; 
} 

():私のメインの中

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(tetra_vertices), tetra_vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(tetra_colors), tetra_colors, GL_STATIC_DRAW); 
program = initshader("a4a_vs.glsl", "a4a_fs.glsl"); 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
pos = glGetAttribLocation(program, "vPos"); 
glEnableVertexAttribArray(pos); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
color = glGetAttribLocation(program, "vColor"); 
glEnableVertexAttribArray(color); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

ModelView = glGetUniformLocation(program, "modelview"); 
Projection = glGetUniformLocation(program, "projection"); 

glEnable (GL_DEPTH_TEST); 
glClearColor(0.0, 0.0, 0.0, 1.0); 
glewExperimental = GL_TRUE; 
glewInit(); 

そして最後に():

GLFWwindow *window = glfwCreateWindow (512, 512, "Hello Cube", NULL, NULL); 
glfwMakeContextCurrent (window); 

setup(argc, argv); //This creates reads in the OFF file and creates the arrays. 

init(); 
reshape(window, 512, 512); 
glfwSetKeyCallback(window, keyboard); 
glfwSetWindowSizeCallback(window, reshape); 

while (!glfwWindowShouldClose (window)) { 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    identity(transform); 
    lookat(transform, eye, at, up); 

    glUseProgram(program); 
    glBindVertexArray(vao); 
    glUniformMatrix4fv(ModelView, 1, GL_FALSE, transform); 
    glUniformMatrix4fv(Projection, 1, GL_FALSE, projection); 
    glDrawArrays(GL_TRIANGLES, 0, (mod->faces * 3)); 
    glfwSwapBuffers (window); 
    if (animation) 
    update(); 
    glfwPollEvents(); 
} 

最終的に私はサイクル違う投げることができるように、リストに配列を格納したいです異なるOFFファイルからのオブジェクト。しかし今のところ私はただそれに何かを描きたいだけです。どんな支援も大歓迎です。ありがとうございました。

+0

同様の質問が1時間前に返されました[OpenGL生成三角形メッシュ](https://stackoverflow.com/questions/47731981/opengl-generate-triangle-mesh) - 'glBufferData(GL_ARRAY_BUFFER、sizeof(GLfloat) * mod-> faces * 3 * 3、tetra_vertices、GL_STATIC_DRAW); ' – Rabbid76

答えて

1

sizeof演算子はオブジェクトまたは型のサイズを照会し、渡された式によって返される型のバイト数を返します。 tetra_verticesのタイプはGLfloat*なので、sizeof(tetra_vertices)はポインタタイプのサイズを返します。これはおそらくハードウェアによっては4または8です。

glBufferDataの2番目のパラメータは、バイト単位のデータバッファのサイズです。

これは、このようなあなたのコードを変更しなければならないことを意味:

size_t vertex_size = sizeof(GLfloat) * mod->faces * 3 * 3; 
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)vertex_size, tetra_vertices, GL_STATIC_DRAW); 

あなたは色の属性バッファtetra_colorsのために同じことをしなければなりません。

関連する問題