質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

解決済

1回答

2439閲覧

OpenGLで2つのオブジェクトを表示するには

ReiHiguchi

総合スコア73

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2016/01/14 13:15

OpenGLで2つのオブジェクトを同時にを描画することができません。
例えば立方体と三角形のを表示したい時、

#include <stdio.h> #include <stdlib.h> #include <GL/glew.h> #include <glfw3.h> GLFWwindow *window; #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <common/shader.hpp> int main(void) { if(!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); return -1; } glfwWindowHint(GLFW_SAMPLES, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); window = glfwCreateWindow(1024, 768, "Tutorial 04 - Colored Cube", NULL, NULL); if(window == NULL) { fprintf(stderr, "Failed to open GLFW window\n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glewExperimental = true; if(glewInit() != GLEW_OK) { fprintf(stderr, "Failed to initialize GLEW\n"); return -1; } glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); glClearColor(0.0f, 0.0f, 0.4f, 0.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); GLuint programID = LoadShaders("TransformVertexShader.vertexshader", "ColorFragmentShader.fragmentshader"); GLuint MatrixID = glGetUniformLocation(programID, "MVP"); glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f); glm::mat4 View = glm::lookAt(glm::vec3(4, 3, -3), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); glm::mat4 Model = glm::mat4(1.0f); glm::mat4 MVP = Projection * View * Model; static const GLfloat triangle_vertex_buffer_data[] = {1, 0, 0, 0, 1, 0, 1,1,3}; static const GLfloat triangle_color_buffer_data[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f}; static const GLfloat g_vertex_buffer_data[] = { -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f}; static GLfloat g_color_buffer_data[12 * 3 * 3]; for(int v = 0; v < 12 * 3; v++) { g_color_buffer_data[v * 3 + 0] = 1.0f; g_color_buffer_data[v * 3 + 1] = 0.7f; g_color_buffer_data[v * 3 + 2] = 0.4f; } GLuint vertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData( GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); GLuint colorbuffer; glGenBuffers(1, &colorbuffer); glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); glBufferData( GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); GLuint trivertexbuffer; glGenBuffers(1, &trivertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, trivertexbuffer); glBufferData( GL_ARRAY_BUFFER, sizeof(trivertexbuffer), triangle_vertex_buffer_data, GL_STATIC_DRAW); GLuint tricolorbuffer; glGenBuffers(1, &tricolorbuffer); glBindBuffer(GL_ARRAY_BUFFER, tricolorbuffer); glBufferData( GL_ARRAY_BUFFER, sizeof(tricolorbuffer), triangle_color_buffer_data, GL_STATIC_DRAW); do { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(programID); glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]); GLuint posAttrib=glGetAttribLocation(programID, "vertexPosition_modelspace"); GLuint colorAttrib=glGetAttribLocation(programID, "vertexColor"); glEnableVertexAttribArray(posAttrib); glEnableVertexAttribArray(colorAttrib); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); glDrawArrays(GL_TRIANGLES, 0, 12 * 3); //立方体が描画される glBindBuffer(GL_ARRAY_BUFFER, trivertexbuffer); glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); glBindBuffer(GL_ARRAY_BUFFER, tricolorbuffer); glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); glDrawArrays(GL_TRIANGLES, 0, 3); //三角形は描画されない glDisableVertexAttribArray(posAttrib); glDisableVertexAttribArray(colorAttrib); glfwSwapBuffers(window); glfwPollEvents(); } while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0); glDeleteBuffers(1, &vertexbuffer); glDeleteBuffers(1, &colorbuffer); glDeleteBuffers(1, &trivertexbuffer); glDeleteBuffers(1, &tricolorbuffer); glDeleteProgram(programID); glDeleteVertexArrays(1, &VertexArrayID); glfwTerminate(); return 0; }

shaderファイルはこのようになっています。

//ColorFragmentShader.fragmentshader #version 120 // Interpolated values from the vertex shaders varying vec3 fragmentColor; void main(){ // Output color = color specified in the vertex shader, // interpolated between all 3 surrounding vertices gl_FragColor = vec4(fragmentColor, 1); }
//TransformVertexShader.vertexshader #version 120 // Input vertex data, different for all executions of this shader. attribute vec3 vertexPosition_modelspace; attribute vec3 vertexColor; // Output data ; will be interpolated for each fragment. varying vec3 fragmentColor; // Values that stay constant for the whole mesh. uniform mat4 MVP; void main(){ // Output position of the vertex, in clip space : MVP * position gl_Position = MVP * vec4(vertexPosition_modelspace,1); // The color of each vertex will be interpolated // to produce the color of each fragment fragmentColor = vertexColor; }

おかしい点はあるのでしょうか?
教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

glBufferData
を間違えていました

投稿2016/01/15 06:22

ReiHiguchi

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問