2012-04-07 2 views
0

예기치 않은 작업이 발생했습니다. 내 객체에 대해 두 가지 셰이더 프로그램을 만들었습니다. 프로그램 중 하나는 질감이있는 비트 맵 및 uv 데이터를 사용하는 것입니다. 다른 하나는 단순히 색상 데이터를 사용합니다. 두 객체는 ​​매우 다르다. 왜냐하면 솔리드 컬러와 간단한 렌더링 로직을 사용하여 (실체, 배경 등과 같은) 다른 것들이 밉맵으로 렌더링되기 때문에 결국에는 (방향 선, 하이라이트 등) 몇 가지를 표시하기 때문이다. 앞으로. 문제는이 두 개의 다른 쉐이더 프로그램을 사용할 때 하나 또는 다른 쉐이더 프로그램 만 사용한다는 것입니다. 따라서 내 모든 색상 전용 객체가 나타나거나 모든 텍스처 전용 객체가 나타납니다. 분명히, 나는 둘 다 나타나기를 원한다.일부 프로그램에서 다른 Program3D를 렌더링하면 렌더링되지 않습니다.

버텍스 쉐이더 :

//4x4 matrix multiply to get camera angle 
"m44 op, va0, vc0\n" + 
//tell fragment shader about xyz 
"mov v0, va0\n" + 
//tell frament shader about uv 
"mov v1, va1\n" + 
//tell fragment shader about RGBA 
"mov v2, va2\n" 

조각 쉐이더 :

//grab the texture color from texture 0 and 
//the uv coordinates from varying register 1 and 
//store the interpolated value in ft0 
"tex ft0, v1, fs0 <2d,linear,repeat,miplinear>\n" + 
//move this value to the output color 
"mov oc, ft0\n" 

이러한 개체의 렌더링 코드는 다음과 같습니다

여기

는 질감 개체에 대한 내 agal 코드
context3D.setProgram(_renderProgram); 
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, renderMatrix, true); 
context3D.setTextureAt(0, texture); 

// vertex position to attribute register 0 
context3D.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3); 
context3D.setVertexBufferAt(1, uvBuffer, 0, Context3DVertexBufferFormat.FLOAT_2); 
context3D.setVertexBufferAt(2, colorsBuffer, 0, Context3DVertexBufferFormat.FLOAT_4); 

버텍스 쉐이더 :여기에 분명 색깔의 객체에 대한 내 agal 코드 (즉, 어떤 질감)입니다

"m44 op, va0, vc0\n" + // pos to clipspace 
"mov v0, va1" // copy color 

조각 쉐이더 :

"mov oc, v0 " 

이러한 개체의 렌더링 코드는 다음과 같습니다 :

context3D.setProgram(_renderProgram); 
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, renderMatrix, true); 
// vertex position to attribute register 0 
context3D.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3); 
// color to attribute register 1 
context3D.setVertexBufferAt(1, vertexBuffer, 3, Context3DVertexBufferFormat.FLOAT_3); 

내가 알아낼 수없는 몇 가지 이유로 상이한 데이터를 상이한 가변 레지스터 인덱스 (va)에 할당하면 렌더링 절차 중 하나가 실패하게된다. 내 텍스처 루프에서 텍스처 객체를 먼저 렌더링하면 내 모든 채색 된 객체가 사라지고 그 반대도 마찬가지입니다. 개체는 첫 번째 프레임에 대해 올바르게 나타납니다. 그러나 렌더링 루프가 두 번째로 재생 되 자마자이 예기치 않은 동작이 발생합니다. 그것은 작동

context3D.setTextureAt(0, null); 
context3D.setVertexBufferAt(2, null); 

을 :

은 제가 추가하여 컬러 개체의 렌더링 코드를 수정하면 다음과 같은 것을 발견했다. 그러나 이것은 실제로 좋은 해결책이 아닙니다. 내 프로그램의 어딘가에 다른 객체가 n 개의 다양한 레지스터로 렌더링된다는 것을 알고 싶지는 않습니다. 따라서 다른 program3D 인스턴스가 n보다 작 으면, 사용되지 않은 모든 va를 null로 설정해야합니다. 또한, 현재 네 번째 VA가 필요한 일부 개체 (예 : 빛나는 개체)에 대해 새 쉐이더 프로그램을 만들면 모든 다른 쉐이더 프로그램을 수정하여 va4를 null로 설정하여 모든 것이 렌더링되도록해야합니다. 이게 진짜야? 확실하게 나는 여기에서 뭔가를 놓치고있다. 모든 텍스처 레지스터 (ft)를 설정하는 경우에도 마찬가지입니다. 여기에 이전 게시물을 파고

내가 더 많은 정보를 제공 할 수 있습니다

...

+0

답변으로 아직 추가하지 않지만 다음 링크에서 흥미로운 것을 발견했습니다. http://en.nicoptere.net/?p=2119#more-2119 : "문제는이 정점 버퍼 drawTriangles() 호출 후 메모리에 남게되고 다음 객체를 그릴 때 GPU는 셰이더가이를 사용할 것으로 예상하고 그렇지 않은 경우 충돌합니다. 따라서 렌더링하기 전에 3 단계를 구현하는 것이 현명합니다 렌더링 로직. " – jpwrunyan

+0

그런 다음 그는 drawTriangles()를 호출 할 때마다 GPU에서 리소스 할당을 해제한다고 말합니다. 예 : context.setVertexBufferAt (0, null); // -> va0 = null; context.setVertexBufferAt (1, null); // -> va1 = null; context.setTextureAt (0, null); // -> fs0 = null – jpwrunyan

+0

실제 오류가 발생합니까 아니면 코드가 작동하지 않습니까? 더 많은 소스 코드를 제공 할 수 있습니까? 프로그램과 drawTriangles()를 설정하는 순서를 보는 것이 좋습니다. – bwroga

답변

0

. 나는 당신의 의견을 보았고, 나는 당신이 우연히 만난 것이 사실 해결책을 고치는 것이라고 (주로 미래의 독자들의 이익을 위해서) 언급 할 것이라고 생각했다.화면에 3D 객체를 그릴 준비 할 때, 일반적인 과정은 다음과 같습니다

  • 루프를
    • 시작 객체 루프를 렌더링 시작
    • 업로드 프로그램을/
    • 업로드 정점과 텍스처/정의 컴파일
      • 세트 프로그램
      • 설정된 상수
      • 세트의 입력 버퍼와 t
      • 세트의 입력 버퍼 및 텍스처 불행히도
    • 단부 객체 루프
    • 호 본()
  • 단부 렌더링 루프
0

를 널로 extures

  • 호 drawTriangles() , 당신이 옳은 것처럼 보입니다. 적어도 이것은 내가 발견하고 구현 한 해결책이었습니다. 이전에 전달 된 텍스처 그렇지 않으면 질감없는 쉐이더는 여전히 텍스처를 기대합니다 ...

    context3D.setTextureAt(<n>, null); 
    

    을 '삭제'할 필요가 및 렌더링되지 않습니다.

  • 관련 문제