2013-01-10 1 views
0

Im은 모델을 legolize하기 위해 셰이더 작성기가있는 형상 셰이더를 만들려고합니다. 우선 voxelization을 시도하는 중이지만 그 결과는 좋지 않으며 무엇이 잘못되었는지는 알 수 없습니다.형상 셰이더 voxelization이 잘못되었습니다

다음 코드를 사용하면 입력 삼각형의 중심점을 찾은 다음 생성하려는 상자의 중심으로 삼는 것이 좋습니다. enter image description here 이 내가 가야 무엇 : enter image description here

내가 아는

이 메신저 얻는 것입니다 ... 세계에서 가장 우아한 코드가 아니라 최초의 첫째가는 그리고 난 그것이 작동되도록 할 필요가

uniform float stepi; 

void main(void){ 

    float step = stepi/2.; 

    vec3 bari = {(gl_PositionIn[0].x + gl_PositionIn[1].x +gl_PositionIn[2].x)/3, 
(gl_PositionIn[0].y + gl_PositionIn[1].y +gl_PositionIn[2].y)/3, 
(gl_PositionIn[0].z + gl_PositionIn[1].z +gl_PositionIn[2].z)/3}; 

    vec3 bar = bari; 

    float dist = 0; 

    for(int i = 0 ; i < gl_VerticesIn ; i++) 
    { 
     gl_FrontColor = gl_FrontColorIn[ i ]; 
     gl_TexCoord[0] = gl_TexCoordIn [ i ][ 0 ]; 
//-x 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
EndPrimitive(); 

//-y 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     EndPrimitive(); 

//-z 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
EndPrimitive(); 
//+x 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
EndPrimitive(); 

//+z 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
EndPrimitive(); 

//+y 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     EndPrimitive(); 

    } 
} 
+2

어떤 기본 유형을 사용하고 있습니까? 삼각형 또는 쿼드입니까? – bwroga

+0

네, 원시화에 따라 voxelizing 삼각형이 이상하게 보일 수도 있습니다. 예를 들어 두 개의 삼각형으로 구성된 쿼드를 예로 들어 보겠습니다. 하나의 삼각형의 중심은 다른 중심보다 약간 낮을 것이며 결과 복셀은 아마도 모든 축을 따라 서로 오프셋되어 보일 것입니다. 적어도 그것은 직관에 의한 것입니다. –

+0

"이게 내가 얻는 것입니다 :"귀하의 알고리즘은 그렇게 할 수 없습니다. 삼각형의 중앙에 큐브를 만드는 것만으로는 원하는 것을 얻을 수 없습니다. –

답변

0

는 지금은 주요 문제가 큐브를 형성하는 큐브의 중심의 계산 (와 정점의 실제 처분했다, 잘 작동

번호가 같은 calculed되는 중심 :.

vec3 bari = vec3((gl_PositionIn[0].xyz+gl_PositionIn[1].xyz+gl_PositionIn[2].xyz)/3); 

vec3 centre = floor((bari/stepi)+(0.5,0.5,0.5)); 
centre = centre * stepi; 
을 바리 들어오는 삼각형 센터의 baricenter입니다

큐브의 중심입니다.하지 최적의 솔루션, 어떤 모양 구멍을 표시 그러나이 내가 얻을 suposed 있었는지 때문이다.

감사합니다 모두, 당신의 대답에!

1

문제는 정점이 잘못된 순서로 방출된다는 것입니다. 프리미티브의 꼭지점은 시계 방향으로 (메쉬 밖의 관점에서) 방출되어야합니다. 예를 들어, + z 쿼드에서는 정점을이 순서 (왼쪽 위), (왼쪽 아래), (오른쪽 위), (오른쪽 아래) 순서대로 내 보냅니다. (왼쪽 위), (오른쪽 위), 오른쪽), (왼쪽 하단).

또한 for 루프 내부에있는 코드를 유지해야하지만 루프 자체는 제거해야합니다. 지오메트리 셰이더가 실행될 때마다 하나의 큐브 만 방출해야합니다. 지금 당신은 같은 큐브를 여러 번 내고 있습니다.

+0

제 수정 된 답변을 참조하십시오. – bwroga

+0

다시 수정 된 답변. – bwroga

+0

사실 Z의 순서가 맞습니다. 너 어디서 루프를 가지고 있니? 마지막으로 나는 그것을 작동 시키지만, 주된 문제는 큐브가 형성되는 위치를 분산시키는 것이 필요하다는 것이 었습니다. 이제 제대로 작동합니다! 감사합니다 –