2011-02-17 9 views
3

glPolygoneMode(GL_FRONT_AND_BACK, GL_FILL)가 켜져 있고이 상황에서 어떻게 와이어 프레임을 얻을 수 있습니까? 다각형 모드를 GL_LINE으로 바꾸지 않고도 와이어 프레임 렌더링을 할 수 있습니까?OpenGL의 와이어 프레임

+0

어떤 답변 (GL_FRONT_AND_BACK, GL_FILL) – infra

+0

glPolygoneMode을 허용하는 ON, 나는 그것을 떨어져 전환 할 수 없습니다 – infra

+2

당신은 이유를 말씀해 주시겠습니까 당신은 그것을 끌 수 없습니까? – Hannesh

답변

18
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

채우기 ... 채우기를 원합니다.

편집 : 당신은 항상 귀하의 질문이 명확하지 않습니다이

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
// add polygons here 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
+0

아니요, GL_FILL에서 폴리곤 모드를 끌 수 없습니다 – infra

+2

@infra 이유에 대해 설명해 주시겠습니까? –

+0

@infra'GL_FILL'은 폴리곤을 채 웁니다. 질문이 없습니다. 당신은 그것을 피할 수 없습니다. 와이어 프레임을 원한다면 반드시 GL_LINE을 사용해야합니다. 이것은 OpenGL이 와이어 프레임을 처리하기 위해 제공하는 메커니즘입니다! – corsiKa

2

처럼이 완료되면 채우기 위해 다시 넣을 수 있습니다, 기억,하지만 난 당신이 채워진 다각형을 모두 렌더링 할 것인지 생각 그리고 와이어 프레임. 너무 사소한 것은 아닙니다. 난 당신이 몇 가지 큰 미들웨어가 있다고 가정

glPolygonMode(... GL_FILL); 
draw(); 
glPolygonOffset(param1, param2); 
glPolygonMode(... GL_LINE); 
draw(); 

하지만이 같은 질문에서 등, glPolygonOffset에 전달할

3

을 값을 알아내는 등, 문제가없는 것은 아니다 : 문제를 해결하기 위해 고전적인 방법은 , 셰이더에만 액세스 할 수 있습니까? 맞습니까?

이 경우, 예를 들면, 호출을 가변하여 버텍스 쉐이더에 vertexID를 만듭니다

varying float vertexID; # in GLSL <= 3, or 
out float vertexID;  # in GLSL 4 

및 지정이 내장 된 gl_VertexID :

vertexID = (float)gl_VertexID; 

이렇게하면 ' 프래그먼트 셰이더에서 gl_VertexID에 액세스 할 수 있지만 보간됩니다! 이것은 예를 들어 하나의 정점에서 2, 이웃에서 3, 그리고 2.5 사이에 있기 때문에 훌륭합니다.

그래서 vertexID가 2에 가까울 지 확인해야합니다 (3 번). 그렇다면 가장자리에 가깝습니다. 그것은 시각화를 위해 충분해야합니다 & 디버그.

in float vertexID; # or 
varying float vertexID; 

// blabla 

if (fract(vertexID) < 0.1){ 
    outcolor = vec4(1,0,0,0); # in glsl 4 
} 

이 방법으로 각 삼각형의 가장자리를 2 개만 얻을 수 있습니다. 그리고 어쩌면 일부는 얇을 것입니다 (하나의 vertexID가 2이고 다른 하나가 1000 인 경우 0.1 영역이 적음). 장면을 렌더링의 모든 시간에 신비 셰이더 (또는 알파 - 깊이 조화와 흑 마술)와

+0

네, 맞습니다 : 시스템은 쉐이더 지향입니다 (프로그래밍 가능한 파이프 라인 만 의미 함). 그리고 당신의 대답은 아주 가깝습니다, 고마워요! – infra

+0

하지만 이상하게 보입니다 - 장면의 모든 객체에이 쉐이더를 추가하십시오. ( – infra

+0

@infra 마지막 코멘트를 얻지 못했습니다. 원하는 경우 하나의 메쉬에만 설정할 수 있습니다. 시스템에서 허용하는 경우 하나만 설정할 수 있습니다. – Calvin1602