2012-01-30 2 views

답변

3

Jave가 말한 것 이외에. Z- 파이팅 인공물을 방지하기 위해 오브젝트 전체를 확대하는 대신 (오브젝트와 현재 뷰에 따라 최적의 양이 항상 있음) 폴리곤 오프셋 (glPolygonOffset 사용)을 사용할 수도 있습니다.이 폴리곤 오프셋의 주요 용도는 실제로 와이어 프레임 오버레이입니다.

기본적으로 깊이 버퍼에 쓸 수 없기 때문에 ES에서 다르게 수행 할 수없는 결과 조각의 깊이 값을 약간 조정하여 작동합니다 (ES에서 삭제하지 않은 이유라고 생각합니다. 데스크톱 GL 3+에서했던 것처럼). 따라서 기본적으로 동일한 꼭지점을 사용하여 단색 개체와 개체의 줄 버전을 렌더링하지만 단편 개체의 다각형 오프셋 구성을 사용하여 결과 조각의 깊이 값을 약간 늘리면 (뷰어에서 멀리 떨어 뜨림) 배치하여 삼각형은 항상 뷰 공간 (또는 실제로는 윈도우 공간)의 선 뒤쪽에 있습니다. 자세한 내용은 here을 참조하십시오.

4 면체의 경우 매우 날카로운 모서리로 인해 문제가 발생할 수 있지만.

3

1 : 먼저 GLES20.GL_LINES, GL_LINE_LOOP 또는 GL_LINE_STRIP를 사용하여 개체를 평소와 같이 그려서 다시 그립니다 (다른 셰이더 또는 개체와 같은 색상이므로 보이지 않습니다).
심도 테스트에서 선이 객체 뒤에 있고 그 선을 무시하도록 결정하지 않도록 선을 그릴 때 객체를 약간 위로 스케일링 할 수 있습니다.

2 : 이것은 쉐이더에서 수행되며 gl_FragColor를 솔리드 컬러에 대해 원하는 rgba 값을 포함하는 vec4로 설정하십시오.

+0

답변을 주셔서 감사합니다.하지만 구문이 올바르지 않습니다. 임 예제에서 일하고 : http://blog.shayanjaved.com/2011/03/13/shaders-android/ 그리고 "gl_FragColor"정의되지 않았습니다. – SpicyWeenie

+0

셰이더와 GLSL에 대해 좀 더 자세히 알고 싶다면 RenderMonkey를 사용하는 것이 좋습니다. RenderMonkey에는 셰이더 프로그래밍에 대한 많은 예제와 좋은 환경이 있습니다. http://developer.amd.com/archive/gpu/rendermonkey/ 페이지/default.aspx – Jave

1

약간의 시간이 걸렸지 만 (1 년 넘게) 여기에 도움이 될 수 있습니다. 원하는 결과를 얻으려면 다른 셰이더를 사용할 필요가 없습니다. 정점 속성 배열을 비활성화 한 다음 상수 정점 속성 데이터 (와이어 프레임 선 색상)를 지정하고로드하여 와이어 프레임을 그릴 수 있습니다. 예를 들면 다음과 같습니다.

float coloredcube[] = { 2, 2, 2, 1, 0, 0, -2, 2, 2, 0, 1, 0, -2, -2, 2, 0, 
     0, 1, 2, -2, 2, 1, 1, 0, 2, 2, -2, 1, 0, 1, -2, 2, -2, 0, 1, 1, -2, 
     -2, -2, 1, 1, 1, 2, -2, -2, 0, 0, 0 

}; 
short indices[] = { 0, 1, 2, 0, 2, 3, //back 

     0, 4, 7, //right 
     0, 7, 3, 

     7, 6, 2, //bottom 
     7, 2, 3, 

     4, 5, 6, //front 
     4, 6, 7, 

     5, 1, 2, //left 
     5, 2, 6, 

     0, 1, 5, 0, 5, 4 //top 
     }; 

short lineindices[] = { 0, 1, 1, 2, 0, 2, 2, 3, 

0, 4, 4, 7, 0, 7, 7, 3, 

7, 6, 6, 2, 7, 2, 4, 5, 

5, 6, 4, 6, 5, 2, 1, 5, 0, 5, 0, 3 }; 

glVertexAttribPointer(iPosition, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),coloredcube); 
glEnableVertexAttribArray(iPosition); 
glVertexAttribPointer(iColor, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),coloredcube + 3); 
glEnableVertexAttribArray(iColor); 

// offset the filled object to avoid the stitching that can arise when the wireframe lines are drawn 
glEnable(GL_POLYGON_OFFSET_FILL); 
glPolygonOffset(2.0f, 2.0f); 
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, indices); 
glDisable(GL_POLYGON_OFFSET_FILL); 

//Then disable the vertex colors and draw the wire frame with one constant color 
glDisableVertexAttribArray(iColor); 
glLineWidth(1.0f); 
GLfloat color[4] = { 1.0f, 0.0f, 0.0f, 0.5f }; 
glVertexAttrib4fv(iColor, color); 
glDrawElements(GL_LINES, 36, GL_UNSIGNED_SHORT, lineindices); 

"OpenGL ES 2.0 프로그래밍 안내서"pp 109,110에서 유사한 예제를 볼 수 있습니다.

관련 문제