2016-11-09 5 views
0

this answer에 따르면 OpenGL을 사용하면 버텍스 쉐이더에서 액세스 할 수있는 텍스처 버퍼 내에 임의의 데이터를 저장할 수 있습니다.OpenGL ES2, GLSL, C++를 사용하여 모델 행렬 데이터를 텍스처에 버퍼링하는 방법은 무엇입니까?

모든 모델의 세계 행렬을 포함하는 크기 4096 * 256 * 4의 Float32Array를 만들었습니다 (~ 256k 모델에 충분 함). 각 모델에는 텍스처로부터 행렬을 읽는 데 사용되는 modelIndex 속성이 있습니다. 그런 다음 각 프레임에서 전체 텍스처를 gl.texSubImage2D하고 각 그리기 호출에서 최대한 많이 그립니다.

예 시나리오 :
내가 공통 쉐이더를 공유하는 독특한 모델의 무리를 가지고, 자신의 버텍스 위치는 하나의 VBO에 포장. 각 모델을 텍스처 버퍼에서 가져온 고유 한 모델 행렬로 업데이트하고 단일 glDrawElements() 호출에 그립니다.

일부 매우 거친 의사 코드 :

// In C++ 
struct Vertex { 
    GLFloat x, y; 
    GLuint matrixID; 
} 

// Create an array of floats that represent a unique model matrix 
// Assume pre-calculation of values 
GLfloat data[32] { /* 32 floats, two 4x4 matrices */ } 
glTexImage2D(..., data); 

// Then in the vertex shader 
attribute vec4 in_Position; // x, y, 1.0, matrixID; 
uniform mat4 uf_Projection; 
void main() { 
    // I need help implementing this magical function... 
    mat4 model = getMatrixFromTextureBuffer(in_Position.w); 

    // Apply unique model matrix 
    gl_Position = uf_Projection * model * vec4(in_Position.xy, 1.0, 1.0); 
} 

// Draw everything! 
glDrawElements(...); 

누군가가이를 구현하는 방법의 예를 공유 주시겠습니까? 나는 관련 정보를 온라인으로 찾기 위해 고심하고있다.

답변

1

OpenGL을 사용하면 버텍스 셰이더에서 에 액세스 할 수있는 텍스처 버퍼 내에 임의의 데이터를 저장할 수 있습니다.

이는 OpenGL ES 2.0의 일부 구현에 을하지만 그것은 (최대 정점 텍스처링 단위가 0이 될 수있다) 사양에 필요하지, 그리고 많은는 OpenGL ES 2.0 유일한 GPU는 지원하지 않습니다 .

마찬가지로 OpenGL ES 2.0은 부동 소수점 텍스처링 (확장자 제외)을 지원하지 않으므로 둘 중 하나를 사용할 수 있습니다.

마지막으로, 작동시킬 수 있다고해도, 모든 정점의 텍스처에서 16 요소 FP32 행렬을로드하는 것은 매우 미미한 속도가 될 것이므로, 이것이 데스크탑 용 장난감 프로젝트가 아니면 않는 것이 좋습니다. GPU ... (즉, 대상이 OpenGL ES 2.x를 사용하여 상업용 모바일 컨텐츠를 출하하는 경우에는 좋은 생각이 아닙니다.)

+0

안녕하세요 solidpixel, 내 검색에서 답을 찾지 못했습니다. 호환성 문제는 전혀 고려하지 않았습니다. 지적 해 주셔서 감사합니다. 당신이 그것을 언급했기 때문에, 비록 내가 그것을 사용하지 않기를 선택했다 할지라도, 나는 이것이 구현 될 수있는 방법을 여전히보고 싶습니다. 아주 간단한 예제 만 다루기 때문에 GPU로 업로드하기 전에 각 버텍스에 모델 위치를 베이킹하기로 결정했습니다. 나는 내가 아직 만나지 못했던 병목을 최적화하려고 노력함으로써 내가 복잡한 것을 깨달았다. 바보. – EddieH