CODEONWORT

셰이더 프로그램에서 쓰지 않는 정점 버퍼, 텍스처는 해제해야 한다 본문

Season 1/플래시

셰이더 프로그램에서 쓰지 않는 정점 버퍼, 텍스처는 해제해야 한다

codeonwort 2012.08.17 20:08
Stage3D 쓰면서 백색 공포에 완전히 질려버렸다. 뭐만 새로 그리려고 하면 흰 화면 그대로라 돌아버리겠다.

이번에는 셰이더에서 쓰지 않는 리소스가 문제였다.

정사면체를 단색으로 그리기 위한 셰이더 프로그램이다.
<정점 셰이더>
const vshader2:String = "m44 op, va0, vc0"

<픽셀 셰이더>
const fshader2:String = "mov oc, fc0"

정점 셰이더는 0번 정점 버퍼와 0~3번 상수 레지스터를 쓰고 픽셀 셰이더는 0~3번 상수 레지스터를 쓴다.

이제 두 셰이더를 한 프로그램으로 묶어 사용한다.

코드A
context.setProgram(shadowProgram) // 위의 셰이더들을 묶은 프로그램
context.setProgramConstantsFromMatrix('vertex', 0, tet.getMVP(VP), true) // MVP 행렬
context.setProgramConstantsFromVector('fragment', 0, light.getColorVector()) // 
context.setVertexBufferAt(0, tet_vbuf, 0, "float3")
context.drawTriangles(tet_ibuf, 0, 4)

전혀 문제될 게 없으나 화면에 그려지지 않는다! 골머리를 앓다 나는 결국 코딩을 때려치우고 던파를 켰으며 반짝이는 야이바를 들고 서부 울티를 깬 후 다른 렌더링 코드들을 지우고 하나씩 그려보다 해답을 찾았다.

다음 렌더링 코드는 위 코드의 밑에 있는 코드다.

코드B
context.setProgram(program)
context.setProgramConstantsFromMatrix('vertex', 0, tet.getMVP(VP), true)
context.setVertexBufferAt(0, tet_vbuf, 0, "float3")
context.setVertexBufferAt(1, tet_colorbuf, 0, "float3")
context.drawTriangles(tet_ibuf, 0, 4)

코드A에서는 1번 정점 버퍼를 쓰지 않지만 코드 B에서 1번 정점 버퍼를 사용한다. 물론 코드B가 나중에 실행되지만 enterFrame 이벤트 안에서 그리다보니 처음에만 제대로 그려지고 바로 다음 프레임부터 안 그려진다.

안 쓰는 거 냅두는 데 왜 안 그려지는 지는 모르겠지만 렌더링할 때 쓰는 셰이더 프로그램에서 쓰지 않는 정점 버퍼들은 비워야 한다. setVertexBufferAt()에서 VertexBuffer3D 객체 대신 null을 넣어 호출하면 된다.

context.setProgram(shadowProgram) // 위의 셰이더들을 묶은 프로그램
context.setProgramConstantsFromMatrix('vertex', 0, tet.getMVP(VP), true) // MVP 행렬
context.setProgramConstantsFromVector('fragment', 0, light.getColorVector()) // 
context.setVertexBufferAt(0, tet_vbuf, 0, "float3")
context.setVertexBufferAt(1, null) // 쓰지 않음을 명시해야 렌더링이 제대로 된다
context.drawTriangles(tet_ibuf, 0, 4)

텍스처도 마찬가지다. 어딘가에서 텍스처를 썼다면
context.setTextureAt(0, shadowTex)

코드A에 다음 줄도 넣어야 한다.
context.setTextureAt(0, null)

단 안 쓰는 정점/픽셀 상수 레지스터들은 놔둬도 지금까지는 렌더링에 영향이 없었다.
2 Comments
댓글쓰기 폼