2017-12-06 2 views
0

안녕, 나는 OpenGL을 즉를 사용하여 두 개체를 표시하려고 예상대로 행동하지., 1) 두 개의 텍스처 (A 나무 상자 패턴과 웃는)의 혼합으로 큐브을 회전 전경 및 2) 직사각형 플레이트은 단지 하나의 텍스처 (어두운 회색 목재)를 배경으로합니다. 나는 직사각형 판의 표시에 적용되는 코드의 일부, 모두 텍스처 (나무 상자웃는) 표시회전하는 큐브를 주석 처리합니다. 그렇지 않으면 큐브 만 표시 나무 상자 질감 및 어두운 회색 나무 질감도 즉 웃는 질감 회전 큐브 사라지고, 직사각형 판에 표시된다. 1) http://oi68.tinypic.com/2la4r3c.jpg (직사각형 플레이트 코드 부분) 및 2) http://i67.tinypic.com/9u9rpf.jpg (직사각형 플레이트 코드 부분이 주석 처리되지 않은) 이미지를 찾으십시오. 코드의 relavant 부분은이 코드에 관한 두 가지 질문이 OpenGL을 사용하여 두 개체를 표시합니다. 텍스처

// Rotating Cube =================================================== 
// Texture of wooden crate 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture1); 
glUniform1i(glGetUniformLocation(ourShader_box.Program, "ourTexture1"), 0); 

// Texture of a smiley 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texture2); 
glUniform1i(glGetUniformLocation(ourShader_box.Program, "ourTexture2"), 1); 

// lets use the box shader for the cube 
ourShader_box.Use(); 

// transformations for the rotating cube --------------------------------- 
glm::mat4 model_box, model1, model2; 
glm::mat4 view_box; 
glm::mat4 perspective; 

perspective = glm::perspective(45.0f, (GLfloat)width_screen/(GLfloat)height_screen, 0.1f, 200.0f); 

model1 = glm::rotate(model_box, (GLfloat)glfwGetTime()*1.0f, glm::vec3(0.5f, 1.0f, 0.0f)); 
model2 = glm::rotate(model_box, (GLfloat)glfwGetTime()*1.0f, glm::vec3(0.0f, 1.0f, 0.5f)); 
model_box = model1 * model2; 

view_box= glm::translate(view_box, glm::vec3(1.0f, 0.0f, -3.0f)); 

GLint modelLoc_box = glGetUniformLocation(ourShader_box.Program, "model"); 
GLint viewLoc_box = glGetUniformLocation(ourShader_box.Program, "view"); 
GLint projLoc_box = glGetUniformLocation(ourShader_box.Program, "perspective"); 

glUniformMatrix4fv(modelLoc_box, 1, GL_FALSE, glm::value_ptr(model_box)); 
glUniformMatrix4fv(viewLoc_box, 1, GL_FALSE, glm::value_ptr(view_box)); 
glUniformMatrix4fv(projLoc_box, 1, GL_FALSE, glm::value_ptr(perspective)); 
// -------------------------------------------------------------------- 

// Draw calls 
glBindVertexArray(VAO_box); 
glDrawArrays(GL_TRIANGLES, 0, 36); 
glBindVertexArray(0); 

// Rectangular Plate ===================================================== 
// Background Shader 
ourShader_bg.Use(); 

// Texture of dark grey wood 
glActiveTexture(GL_TEXTURE2); 
glBindTexture(GL_TEXTURE_2D, texture_wood); 
glUniform1i(glGetUniformLocation(ourShader_bg.Program, "ourTexture3"), 2); 

// Transformations ------------------------------------------- 
glm::mat4 model_bg; 
glm::mat4 view_bg; 

GLint modelLoc_bg = glGetUniformLocation(ourShader_bg.Program, "model"); 
GLint viewLoc_bg= glGetUniformLocation(ourShader_bg.Program, "view"); 
GLint projLoc_bg = glGetUniformLocation(ourShader_bg.Program, "perspective"); 

glUniformMatrix4fv(modelLoc_bg, 1, GL_FALSE, glm::value_ptr(model_bg)); 
glUniformMatrix4fv(viewLoc_bg, 1, GL_FALSE, glm::value_ptr(view_bg)); 
glUniformMatrix4fv(projLoc_bg, 1, GL_FALSE, glm::value_ptr(perspective)); 
// ----------------------------------------------------------- 

// Draw calls 
glBindVertexArray(VAO_bg); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glBindVertexArray(0); 
// ================================================================= 

아래에 붙여 넣습니다.

  • 왜 스마일리가 사라지고 있습니까?
  • 여러 개체를 렌더링하는 방법은 다음과 같습니다. OpenGL은 객체에 관심이 없다는 것을 알고 있습니다. 단지 정점에만 관심이 있지만,이 경우에는 분리 된 분리 객체입니다. 그래서, 하나의 VAO에 바인드 된 두 개의 VBO 또는 각각의 오브젝트에 대해 두 개의 VAO에 바인드 된 별도의 VBO로 구성해야합니까? 아니면 어느 쪽이든 상관 없다 - 코더의 선택과 코드의 우아함에 달려 있는가?

답변

1

두 개의 객체 (삼각형)에 대해 동일한 셰이더와 동일한 행렬을 사용하고 동일한 지오메트리 유형을 사용하고 있으므로 셰이더를 두 번 설정하는 이유는 무엇입니까? 시도해 보셨습니까?

  • 세트 쉐이더
  • 귀속 버퍼 # 1
  • 귀속 질감 1
  • 그리기 오브젝트 # 1
  • 귀속 버퍼 # 2
  • 귀속 텍스처 # 2
  • 그리기 오브젝트 # 2
+0

정말 고마워요 ..... 아름답게 작동했습니다. – ram

관련 문제