OpenGL:일괄 Renderer:한 변환을 CPU 또는 GPU?

0

질문

를 개발하고 2D 게임 엔진을 지원하는 3D 다. 에서 이 현재 개발의 단계,나는 일에 일괄 renderer. 의 일부로 알고 있습니다 때,그래픽 처리 함께,유니폼에 대한 지원 색상(RGBA),질감표,질감 ID(텍스처 인덱스),그리고 모델 변환 모체 창 밖으로 이동,하지만 그 대신를 통해 전달되 vertex buffer. 지금,나는 구현을 통과 모델을의 위치,색상,질감표,질감 ID 를 vertex buffer. 나의 꼭지점 버퍼 형식으로 다음과 같이 지금:

float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};

나는에 대한 통합을 계산하는 개체해야에서 세계를 사용하여 공간을 변화 행렬입니다. 이것은 나에게 질문합니다:

야 하는 변화 행렬에 곱 모델의 정점에 위치 CPU 또는 GPU?

뭔가를 염두에 두는 경우가 그것을 전달하 vertex buffer,내가 가진 것을 업로드 변화 행렬에 한 번씩 꼭짓점(4 시간당 sprite)는 나의 메모리입니다. 다른 한편으로,곱하여 모델의 정점에 위치하여 변화 행렬에 CPU 그것처럼 보인다 느린 것과 비교 GPU 의 동시성 기능입니다.

이것은 어떻게 내 꼭지점 버퍼 형식으로 보이는 것 같으면 내가 계산에서 변화하는 GPU:

float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};

이 질문은 대부분 이론적으로 구동됩니다. 그래서,이론적 및 기술적 대답은 많이 주시면 감사하겠습니다. 그러나 참조를 위해,여기에는 코드입니다.

c++ glm-math glsl opengl
2021-11-24 03:43:20
2

최고의 응답

1

해야 합 변환을 CPU 또는 GPU?

그것은 정말 상황에 따라 달라집니다. 다시 제출할 경우 꼭지점마다 프레임,그것은 최고의 벤치마크 의 경우입니다. 하려면 애니메이지 않고 다시 제출하의 모든 꼭지점,당신은 선택의 여지가 없지만을 적용하에 그것을 의미합니다.

어떤 이유로,당신이 결정하는 경우 적용의 변환에 GPU,더 좋은 방법이 있다는 것을하고는 다른 것보다는 복합 매트릭스에 대한 각각의 정점입니다. 나는 대신에 변환을 넣어 매트릭스에서 SSBO:

layout(std430, binding=0) buffer Models {
    mat4 MV[]; // model-view matrices
};

고 저장하는 단일 인덱스에서 각각의 정점에서 VAO:

struct Vert {
    float x, y, r, g, b, a, u, v;
    int textureID, model;
};

꼭짓점 쉐이 갈 수 있다고 전체 매트릭스에 따라 인덱스 특성:

layout(location = 0) in vec4 in_pos;
layout(location = 1) in int in_model;
void main() {
    gl_Position = MV[in_model] * in_pos;
}

조합할 수도 있습니다 그것은 다른당 개체 특성을 같이, textureID.

편집: 당신을 달성할 수 있는 비슷한 것으로 인스턴스 및 다중립니다. 하지만 그것을 가능성이 속도가 느려질 수 있습니다.

2021-11-24 17:20:51

할 수 있습니다 정교한 더 많은 정확히 무엇에 대한 모델이 될 것인가? 내가 노력하고 그것을 구현하고 오직 하나를 얻기 스프라이트 화면에 생각하기 때문에 그것이 나를 보내세요.
Christopher Barrios Agosto

@ChristopherBarriosAgosto 인덱스의 모델 매트릭스에서 MV 배열:0,1,2 등등...
Yakov Galka

기 때문에 당신은 렌더링은 개별적으로 변화 쿼드,는 것입 0,0,0,0,1,1,1,1,2,2,2,2,... 는 경우 렌더링 glDrawElements.
Yakov Galka

나는 알았어요! 모든 작동합니다! 최고의 안드로이드 애플 리케이 전달되었고 해석하는 인덱스 오른쪽 하지만 나 지나 인덱스로 떠 GLSL 되었을 때 기대 int. 나는 그것을 받을 떠 및 GLSL 캐스팅 int 지 그것을 해석하는 모든 인덱스 오른쪽. 나는 그것을 해야 하기 때문에 이 방법은 vertex buffer 은 부동의 유형입니다. 모든 주셔서 감사합니다!
Christopher Barrios Agosto

@ChristopherBarriosAgosto:축하합니다 당신이 그것을 알아 냈다.'vertex buffer 은 부동의 유형은'--꼭지점 버퍼의 바이트 시퀀스. 저장할 수 있습니다 structs 거기에 몇 가지 int 필드 일 float 필드가 있습니다.
Yakov Galka
0

나는 확실하지 않는 방법 당신의 엔진 코드를 실제로처럼 보이지만 나는 가정 그것은 다음과 같은 다른 어떤 OpenGL 프로그램입니다.

그렇다면,내 경험에 변환의 행렬은 일반적으로 전달되는 꼭짓점 셰이더와 적용될 주어진 정점에 대한 정보를 GPU 을 그릴 때의 장면입니다. 예를 들어:

//MVP matrix
GLuint MatrixID = glGetUniformLocation(shaderProgID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);

하지만 경우에 당신을 찾으려면 좌표 세계의 모든 꼭지점에 대한 특정 그룹,외부에 렌더링 기능을,당신은 아마도 그것을 할 필요가에서는 CPU,또는 당신이 필요합니다를 사용하여 병렬 프로그래밍 기법 등을 제공하는 새로운 유형 하에서 작업 GPU.

가장 중요한 것은,그래서 구체적으로 당신이 원하는 세계의 좌표가 정보를 외부 도면 절차? 는 경우에 당신은 단순히 당신을 찾으려는 모델의 좌표로,당신은 단순히트 중심 조정을 위해 각각의 모델에 있는 현장을 추적하는 하나의 좌표보다는 전체 메쉬 그룹입니다.

꼭지점 정보를 항상 있어야에서 모델 좌표 및 꼭지점 버퍼에 저장 없이 접촉하지 않는 한,적용하려는 일부를 수정니다.

2021-11-24 03:57:24

나는 일괄 처리하는 여러 그래픽 함께. 따라서,나는 사용할 수 없습니다 유니폼을 통과하는 그래픽'변환기 때문에,나는 할 수 없이 변경 uniform 변환 사이에 그리기 호출. 그러나 믿을 사용하여 SSBOs 은 매우 좋은 대안입니다.
Christopher Barrios Agosto

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................