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