2014-12-21 2 views
0

enter image description hereDirectX11/OpenGL은 단지 텍스처

이 중 절반이 생겼 방법입니다 렌더링합니다. DX11 및 OpenGL에 사용되는 동일한 정점/UV 좌표를 사용합니다. 이 장면은 DirectX10에서 렌더링되었습니다.

enter image description here

이는 DirectX11 및 OpenGL처럼 보이는 방법이다.

어떻게 이런 일이 발생할 수 있는지 알 수 없습니다. 나는 DX10과 DX11 모두 위에 동일한 코드를 사용하고 있으며, 둘 다 정말로 비슷한 것을 처리한다. 문제가 무엇인지, 문제를 해결하는 방법에 대한 아이디어가 있습니까? 필요한 경우 코드를 보낼 수 있습니다.

enter image description here 또한 다른 질감을 사용합니다.

enter image description here 은 텍스처의 투명한 부분을 빨간색으로 변경했습니다.

조각 쉐이더 GLSL

#version 330 core 

in vec2 UV; 
in vec3 Color; 
uniform sampler2D Diffuse; 


void main() 
{ 

    //color = texture2D(Diffuse, UV).rgb; 
    gl_FragColor = texture2D(Diffuse, UV); 
    //gl_FragColor = vec4(Color,1); 
} 

버텍스 쉐이더 GLSL

#version 330 core 

layout(location = 0) in vec3 vertexPosition; 
layout(location = 1) in vec2 vertexUV; 
layout(location = 2) in vec3 vertexColor; 
layout(location = 3) in vec3 vertexNormal; 

uniform mat4 Projection; 
uniform mat4 View; 
uniform mat4 World; 

out vec2 UV; 
out vec3 Color; 

void main() 
{ 

    mat4 MVP = Projection * View * World; 
    gl_Position = MVP * vec4(vertexPosition,1); 

    UV = vertexUV; 

    Color = vertexColor; 

} 
+0

나중에 참조 할 수 있도록 GLSL 3.30 코어 쉐이더를 작성할 때는'gl_FragColor' 또는'texture2D (...) '를 사용하지 마십시오. 그것들은 더 이상 사용되지 않습니다. 많은 GLSL 컴파일러를 사용하면 계속 사용할 수 있지만 필수는 아닙니다. 사용자 정의 프래그먼트 출력 (예 :'vec4 frag_color')과'texture (...)'(GLSL 1.30에서 시작하는 모든 샘플러 유형을 사용하는 오버로드 된 함수)를 사용해야합니다. –

답변

0

나는 오류를 발견했다.

이유는 텍스처 샘플러 상태를 랩/반복으로 설정하는 것을 잊었 기 때문입니다. uv 좌표가 최대 1이되도록 클램프하도록 설정되었습니다.

1

빨리 당신이 (좋은) 얼굴 컬링을 다시 사용하는 것 같습니다, 그리고 모델의 다른 측면은 말했다 잘못되다. 얼굴 컬링을 다시 되돌려 놓음으로써 이것이 문제가 될 수 있습니다 (OpenGL : glDisable (GL_CULL_FACE)).

올바른 수정은 얼굴을 제대로 감으려는 것입니다 (일반적으로 반 시계 방향입니다). 이 모델을 얻을 수있는 위치에 따라 다릅니다. 스스로 생성하는 경우 모델 생성 루틴을 수정하십시오. 일반적으로 3D 모델링 소프트웨어로 작성된 모델 파일에는 정확한면 감기 기능이 있습니다.

+0

hm 권선 순서가 바뀌거나 권선 순서가 바뀌지 않아 아무 것도 바뀌지 않습니다. gl_cull_face가 비활성화되어 있습니다 (켜기 만하면 테스트해볼 수 있지만 비슷하지만 결과는 다릅니다) – PuRe

+0

내 추측 이었지만 뒷면의 도려면 문제라면 다른 쪽의 새가 보입니다 주위를 돌면서. 새의 절반 만 그려지는 것처럼 보이지만 올바르게 그려집니다. – user1118321

0

이것은 추측이지만 시스템에 그리려는 정확한 다각형 수를 말하고 있습니까? glBufferData()과 같은 호출은 정점 또는 다각형 수가 아닌 데이터의 바이트 단위 크기를 사용합니다. (아마도 대신에 numBytes이라는 매개 변수를 지정 했어야합니까?) 또한 크기에는 모든 데이터의 크기가 포함되어야합니다. 색상, 법선, 텍스처 좌표 및 정점이 모두 인터리브 된 경우 모든 텍스처의 크기를 포함해야합니다.

이것은 glDrawElements()과 다른 것들이 크기 인수로 정점 수를 사용한다는 사실에 더욱 혼란 스럽습니다. 이 인수의 이름은 count이지만, 폴리곤 수가 아닌 정점 수가 분명하지는 않습니다.

+0

잘 렌더링됩니다. 다른 텍스처를 사용하여 다른 그림을 추가했습니다. 그 검은면은 제대로 렌더링되지 않은면입니다. 텍스처의 투명한 부분을 빨간색으로 변경했는데 위의 결과를 볼 수 있습니다. – PuRe

-1

당신이 시도 할 수있는 몇 가지 :

  1. 깊이 테스트를 활성화되어 있습니까? 'other'측의 다각형의 내부면이 시점에 가까운 다각형 위에 렌더링되는 것 같습니다. 이는 깊이 테스트가 비활성화 된 경우 발생할 수 있습니다. 이를 대비하여 활성화하십시오.

  2. ? 그렇다면 그것을 끕니다. 회전하는 이미지에서 흰색의 일부 깜박임이 나타나는 것 같습니다. 법선이 잘못 되었기 때문에 ...

HTH

+0

깊이 테스트가 사용 가능하고 조명이 아닙니다. 그 백색의 섬광은 gif 때문에 장면 안에, 없다. – PuRe

+0

확인. 당신이 게시 한 최신 이미지에서 보았을 때 법선이 꺼져있는 것 같습니다. 몇 가지 코드를 붙이시겠습니까? – shekhar

+0

나는 법선을 가지고 있지만 번개를 사용할 시점이 아니기 때문에 아무 곳에 나 사용하지 않을 것입니다. – PuRe