cuốn sách gpt4 ai đã làm

Các đỉnh OpenGL trong bộ đệm lưu trữ shader

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:16:11 27 4
mua khóa gpt4 Nike

Tôi hiện đang phát triển một hệ thống hạt bằng cách sử dụng các trình đổ bóng máy tính. Tôi đặt tất cả các hạt vào bộ đệm lưu trữ shader. Một hạt chứa hai đỉnh, vị trí hiện tại và vị trí trước đó.

hạt cấu trúc {
glm::vec4 _currPosition;
glm::vec4 _prevPosition;
};

Sau khi lên lịch đổ bóng điện toán, tôi muốn vẽ tất cả các hạt trực tiếp từ bộ đệm lưu trữ đổ bóng. Vì vậy, đây là những gì tôi đã làm:

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, shaderStorageBufferID);
_shaderManager->useProgram("computeProg");
glDispatchCompute((_numParticles/WORK_GROUP_SIZE)+1, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
_shaderManager->useProgram("shaderProg");
glBindBuffer(GL_ARRAY_BUFFER, shaderStorageBufferID);
glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS, 0, _numParticles);
glDisableClientState(GL_VERTEX_ARRAY);

Vấn đề là tôi nhìn thấy _numParticles trên màn hình, nhưng một nửa trong số chúng được hiển thị bằng thuộc tính _prevPosition trong cấu trúc hạt của tôi. Điều này có nghĩa là một hạt được hiểu là hai đỉnh được vẽ trên màn hình. Nhưng tôi muốn anh ấy bỏ qua thuộc tính _prevPosition trong mỗi cấu trúc hạt. Sai lầm của tôi ở đâu?

Có lẽ cách tôi khởi tạo bộ đệm lưu trữ shader rất quan trọng:

Trình đổ bóng GLuintStorageBufferID;

glGenBuffers(1, &shaderStorageBufferID);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBufferID);
glBufferData(GL_SHADER_STORAGE_BUFFER, numParticles*sizeof(Particle), NULL ,GL_STATIC_DRAW);
struct Particle* hạt = (struct Particle*) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, numParticles*sizeof(Particle), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
for(int i = 0; i < numParticles; ++i){
hạt[i]._currPosition = glm::vec4(i, 0, 0.0, 1.0f);
hạt[i]._prevPosition = glm::vec4(i, 0, 1.0, 1.0f);
}

câu trả lời hay nhất

của bạn hạt Cấu trúc gồm có hai vec4. của bạnđổ bóng tính toánViết hai cho mỗi phần tử mảng vec4.

Tuy nhiên dòng này:

glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);

Nói với OpenGL rằng bạn đang chuyển một vec4 mảng. Bạn không. Bạn đang truyền một mảng trong đó mỗi phần tửhai vec4. Bạn muốn bỏ qua cái thứ hai.

Vì vậy, bạn thông báo cho OpenGL bằng cách cung cấp bước tiến phù hợp:

glVertexPointer(4, GL_FLOAT, sizeof(Particle), (GLvoid*)0);

Ồ, nhân tiện: bạn vẫnsử dụng sai rào cản .Chỉ vì mã của bạn hoạt động không có nghĩa là nó được đảm bảo. Các hoạt động tải/lưu trữ không đồng bộ có thể phức tạp trừ khi bạn thực hiện đúng mọi thứ.

Về c++ - đỉnh OpenGL trong bộ đệm lưu trữ shader, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/12752279/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress