OpenGL은 여러 개체를 표시하는 동안 흰색 화면을 표시합니다.

에서

간단한 큐브에 노멀 매핑을 구현하려고했지만 노멀에 문제가 있었기 때문에 지오메트리 셰이더를 사용하여 표시하고 싶었습니다. learnopengl 튜토리얼에 따라 기본적으로 mesh.render ()를 두 번 호출합니다. 처음에는 모델을 그리고 두 번째는 법선을 표시합니다. 내가 똑같이하려고 할 때 나는 이것을 얻는다.

First_screenshot

Second_screenshot

정육면체가 잘 그려져있는 것 같지만 앞에 이상한 흰색 사각형이 있고 이유를 모르겠습니다. 드로잉 문제인지 지오메트리 셰이더인지 모르겠으므로 둘 다 게시하겠습니다.

내 코드 :


glutDisplayFunc(MyRenderScene);    
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);

glGenVertexArrays(1,&global.gVAO); 
glGenBuffers(1, &global.VBO);
glBindVertexArray(global.VAO);
glBindBuffer(GL_ARRAY_BUFFER, global.VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glGenBuffers(1, &global.IBO);    
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, global.IBO);    
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glGenVertexArrays(1,&global.gVAO); 
glGenBuffers(1, &global.gVBO);
glBindVertexArray(global.gVAO);
glBindBuffer(GL_ARRAY_BUFFER, global.gVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glGenBuffers(1, &global.gIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, global.gIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

여기에서는 기본적으로 동일한 구조를 두 버퍼에 전달합니다. 버퍼는 전역 구조체에 있습니다.

이것은 MyRenderScene ()입니다.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

global.shaders.enable(); // glUseProgram
global.shaders.set_sampler(0); // setting textures
global.shaders.set_sampler(1);

global.sceneT.set_camera(
    global.camera.position(),
    global.camera.lookat(),
    global.camera.up()
);

glm::mat4 model = glm::mat4(1.0f);
glm::vec3 vaxis = glm::vec3(0.0,1.0,0.0);
glm::vec3 haxis = glm::vec3(1.0,0.0,0.0);
model = glm::rotate(model,glm::radians(global.gradX),haxis);
model = glm::rotate(model,glm::radians(global.gradY),vaxis);
glm::mat4 projection = glm::perspective(glm::radians(40.0f), (float)global.WINDOW_WIDTH/(float)global.WINDOW_HEIGHT, 0.1f, 100.0f);
glm::mat4 view = glm::lookAt(global.camera.position(),global.camera.lookat()+ global.camera.position(),global.camera.up());

global.shaders.set_model(model);
global.shaders.set_view(view);
global.shaders.set_projection(projection);
global.shaders.set_viewPos(global.camera.position());
global.shaders.set_lightPos(lightPos);
global.shaders.update_uniforms();

glBindVertexArray(global.VAO);   

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
    reinterpret_cast<GLvoid*>(offsetof(struct Vertex, position)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, textcoord)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, normal)));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, tangent)));

glBindBuffer(GL_ARRAY_BUFFER, global.VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, global.IBO);

global.brickwall.Bind(GL_TEXTURE0+0); // binding textures
global.brickwall_normals.Bind(GL_TEXTURE0+1);

glDrawElements(GL_TRIANGLES,36,GL_UNSIGNED_INT,0);

glBindVertexArray(0);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);

global.geometryShader.enable(); // setting up geometry shader
global.geometryShader.set_projection(projection);
global.geometryShader.set_model(model);
global.geometryShader.set_view(view);
global.geometryShader.update_uniforms();

glBindVertexArray(global.gVAO);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
    reinterpret_cast<GLvoid*>(offsetof(struct Vertex, position)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, textcoord)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, normal)));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, tangent)));

glBindBuffer(GL_ARRAY_BUFFER, global.gVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, global.gIBO);
  
glDrawElements(GL_TRIANGLES,36,GL_UNSIGNED_INT,0);

glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);

glutSwapBuffers();

glutPostRedisplay();***

동일한 vertexArrays 및 vertexArrayBuffer를 호출하려고 시도했지만 동일한 결과를 얻습니다. 정점 셰이더는 다음과 같습니다.


#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 textcoord;
layout (location = 2) in vec3 normal;
layout (location = 3) in vec3 tangent; 

out VS_OUT {
    vec3 newNormal;
} vs_out;

uniform mat4 view;
uniform mat4 model;

void main() {
    mat3 normalMatrix = mat3(transpose(inverse(view * model)));
    newNormal = vec3(vec4(normalMatrix * normal, 0.0));
    gl_Position = view * model * vec4(position, 1.0);
}

그리고 geometryShader :

#version 330 core

layout (triangles) in;
layout (line_strip, max_vertices = 6) out;

in VS_OUT {
    vec3 newNormal;
} gs_in[];

const float MAGNITUDE = 0.2;

uniform mat4 projection;

void GenerateLine(int index) {
    gl_Position = projection * gl_in[index].gl_Position;
    EmitVertex();
    gl_Position = projection * (gl_in[index].gl_Position + vec4(gs_in[index].newNormal,0.0) * MAGNITUDE);
    EmitVertex();
    EndPrimitive();
}

void main() {
    GenerateLine(0); // first vertex normal
    GenerateLine(1); // second vertex normal
    GenerateLine(2); // third vertex normal
}

가능하고 상상할 수있는 모든 것에 대해 저를 자유롭게 수정하십시오.

Rabbid76

문제의 이유는 지오메트리 셰이더가있는 셰이더 프로그램이 컴파일 또는 링크에 실패하기 때문입니다. 따라서 기하 도형은 기하 도형 셰이더가있는 프로그램 대신 기본 셰이더 프로그램에 의해 그려집니다.

정점 셰이더에 (적어도) 하나의 오류가 있습니다.

newNormal = vec3(vec4(normalMatrix * normal, 0.0));

vs_out.newNormal = vec3(vec4(normalMatrix * normal, 0.0));

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ReactJS 앱은 Kubernetes Ingress를 사용하여 흰색 화면을 표시합니다.

분류에서Dev

ionic 앱을 시작하는 동안 빈 흰색 화면 표시

분류에서Dev

LWJGL은 조명을 추가 한 후 흰색 화면을 표시합니다.

분류에서Dev

화면에 그림을 표시하는 동안 검은 색 화면

분류에서Dev

JQuery 모바일 changePage를 사용하는 동안 전환 전에 항상 흰색 화면이 표시됨

분류에서Dev

pgAdmin은 어두운 테마로 흰색에 흰색 개체 브라우저 텍스트를 표시합니다.

분류에서Dev

SDL2 & Glew를 사용하여 OpenGL에서 간단한 흰색 사각형을 그리려고합니다. 검은 화면이 나타납니다.

분류에서Dev

흰색 원은 검색 도구 모음을 표시합니다.

분류에서Dev

GLSurfaceView의 스크린 샷을 캡처하는 동안 검은 색 화면 표시

분류에서Dev

내 앱이로드되는 동안 흰색 화면을 제거하는 방법은 무엇입니까?

분류에서Dev

Google 모바일 광고 스플래시 전면 광고를 닫은 후보기 컨트롤러를 표시하는 동안 충돌이 발생합니다.

분류에서Dev

UICollectionViewCell에서 segue를 수행하여 작동하지 않는 세부 정보 화면을 표시합니다.

분류에서Dev

TkCalendar : 화면에 여러 DateEntries를 동시에 표시하려고하면 TclError가 발생합니다.

분류에서Dev

레일은 두 개의 검색을 하나로 결합하여 두 개의 결과를 표시합니다.

분류에서Dev

활동 간 전환시 흰색 화면을 피하는 방법

분류에서Dev

Chrome이로드하는 동안 잠시 동안 표시하는 흰색 페이지를 CSS 타겟팅

분류에서Dev

ViewerFilter를 사용하는 Jface 필터는 필터링하는 동안 검정색 선을 표시합니다.

분류에서Dev

로드하는 동안 Android가 스플래시 화면을 표시하지만 대신 검은 색 화면이 표시됨

분류에서Dev

보기를 누를 때 표시되는 흰색 화면

분류에서Dev

ActiveJob이 외부 API에서 많은 데이터를 검색하는 동안 보류 화면을 표시하는 방법

분류에서Dev

EasyUI : 'fitColumns : true'를 사용하는 그리드는 흰색 영역을 표시합니다.

분류에서Dev

OpenGL / GLUT 창에 흰색 화면이 표시됨

분류에서Dev

JPanel은 cardLayout을 사용하는 동안 paintComponent를 표시하지 않습니다.

분류에서Dev

여러 대체 표현식을 사용하는 동안 sed가 한 번만 대체하도록 지시하는 방법은 무엇입니까?

분류에서Dev

Youtube는 상단에 흰색 막대를 표시하고 전체 화면에서 플레이어 컨트롤을 숨 깁니다.

분류에서Dev

OpenGL보기는 빈 (분홍색) 화면 만 표시합니다.

분류에서Dev

Samsung TV Tizen 웹 애플리케이션으로 디버깅하는 동안 빈 흰색 화면을 표시하는 Chrome devtools 검사기

분류에서Dev

Android가 목록보기 대신 흰색 화면을 표시합니다.

분류에서Dev

zsh : tar 파일을 흰색과 다른 색상으로 표시하도록 LS_COLOR를 설정하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    ReactJS 앱은 Kubernetes Ingress를 사용하여 흰색 화면을 표시합니다.

  2. 2

    ionic 앱을 시작하는 동안 빈 흰색 화면 표시

  3. 3

    LWJGL은 조명을 추가 한 후 흰색 화면을 표시합니다.

  4. 4

    화면에 그림을 표시하는 동안 검은 색 화면

  5. 5

    JQuery 모바일 changePage를 사용하는 동안 전환 전에 항상 흰색 화면이 표시됨

  6. 6

    pgAdmin은 어두운 테마로 흰색에 흰색 개체 브라우저 텍스트를 표시합니다.

  7. 7

    SDL2 & Glew를 사용하여 OpenGL에서 간단한 흰색 사각형을 그리려고합니다. 검은 화면이 나타납니다.

  8. 8

    흰색 원은 검색 도구 모음을 표시합니다.

  9. 9

    GLSurfaceView의 스크린 샷을 캡처하는 동안 검은 색 화면 표시

  10. 10

    내 앱이로드되는 동안 흰색 화면을 제거하는 방법은 무엇입니까?

  11. 11

    Google 모바일 광고 스플래시 전면 광고를 닫은 후보기 컨트롤러를 표시하는 동안 충돌이 발생합니다.

  12. 12

    UICollectionViewCell에서 segue를 수행하여 작동하지 않는 세부 정보 화면을 표시합니다.

  13. 13

    TkCalendar : 화면에 여러 DateEntries를 동시에 표시하려고하면 TclError가 발생합니다.

  14. 14

    레일은 두 개의 검색을 하나로 결합하여 두 개의 결과를 표시합니다.

  15. 15

    활동 간 전환시 흰색 화면을 피하는 방법

  16. 16

    Chrome이로드하는 동안 잠시 동안 표시하는 흰색 페이지를 CSS 타겟팅

  17. 17

    ViewerFilter를 사용하는 Jface 필터는 필터링하는 동안 검정색 선을 표시합니다.

  18. 18

    로드하는 동안 Android가 스플래시 화면을 표시하지만 대신 검은 색 화면이 표시됨

  19. 19

    보기를 누를 때 표시되는 흰색 화면

  20. 20

    ActiveJob이 외부 API에서 많은 데이터를 검색하는 동안 보류 화면을 표시하는 방법

  21. 21

    EasyUI : 'fitColumns : true'를 사용하는 그리드는 흰색 영역을 표시합니다.

  22. 22

    OpenGL / GLUT 창에 흰색 화면이 표시됨

  23. 23

    JPanel은 cardLayout을 사용하는 동안 paintComponent를 표시하지 않습니다.

  24. 24

    여러 대체 표현식을 사용하는 동안 sed가 한 번만 대체하도록 지시하는 방법은 무엇입니까?

  25. 25

    Youtube는 상단에 흰색 막대를 표시하고 전체 화면에서 플레이어 컨트롤을 숨 깁니다.

  26. 26

    OpenGL보기는 빈 (분홍색) 화면 만 표시합니다.

  27. 27

    Samsung TV Tizen 웹 애플리케이션으로 디버깅하는 동안 빈 흰색 화면을 표시하는 Chrome devtools 검사기

  28. 28

    Android가 목록보기 대신 흰색 화면을 표시합니다.

  29. 29

    zsh : tar 파일을 흰색과 다른 색상으로 표시하도록 LS_COLOR를 설정하는 방법은 무엇입니까?

뜨겁다태그

보관