簡體   English   中英

透視投影 OPENGL 和計算着色器

[英]Perspective Projection OPENGL and Compute Shaders

我正在關注此站點以使用計算着色器學習光線跟蹤: https : //github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-%28Part-I %29

我的問題,教程詳細介紹了獲取透視投影的過程。 我想我正確地遵循了他的步驟,但我得到了錯誤的結果,我相信我在矩陣計算中犯了一個錯誤。

我的透視投影代碼-

//Getting the perspective projection using glm::perspective
glm::mat4 projection = glm::perspective(60.0f, 1024.0f/768.0f, 1.0f, 2.0f);

//My Camera Position
glm::vec3 camPos=glm::vec3(3.0, 2.0, 7.0);

//My View matrix using glm::lookAt
glm::mat4 view = glm::lookAt(camPos, glm::vec3(0.0, 0.5, 0.0),glm::vec3(0.0, 1.0, 0.0));

//Calculating inverse of the view*projection
glm::mat4 inv = glm::inverse(view*projection);

//Calculating the rays from camera position to the corners of the frustum as detailed in the site.
glm::vec4 ray00=glm::vec4(-1, -1, 0, 1) * inv;
ray00 /= ray00.w;
ray00 -= glm::vec4(camPos,1.0);

glm::vec4 ray10 = glm::vec4(+1, -1, 0, 1) * inv;
ray10 /= ray10.w;
ray10 -= glm::vec4(camPos,1.0);

glm::vec4 ray01=glm::vec4(-1, 1, 0, 1) * inv;
ray01 /= ray01.w;
ray01 -= glm::vec4(camPos,1.0);

glm::vec4 ray11 = glm::vec4(+1, +1, 0, 1) * inv;
ray11 /= ray11.w;
ray11 -= glm::vec4(camPos,1.0);

以上轉換的結果:

[![在此處輸入圖像描述][1]][1]

作為附加信息,我使用以下方法調用我的計算着色器

//Dispatch Shaders. 
glDispatchCompute ((GLuint)1024.0/16, (GLuint)768.0f/8 , 1);

我還使用以下方法將值傳遞給着色器

//Querying the location for ray00 and assigning the value. Similarly for the rest
GLuint ray00Id = glGetUniformLocation(computeS, "ray00");
glUniform3f(ray00Id, ray00.x, ray00.y, ray00.z);

GLuint ray01Id = glGetUniformLocation(computeS, "ray01");
glUniform3f(ray01Id, ray01.x, ray01.y, ray01.z);

GLuint ray10Id = glGetUniformLocation(computeS, "ray10");
glUniform3f(ray10Id, ray10.x, ray10.y, ray10.z);

GLuint ray11Id = glGetUniformLocation(computeS, "ray11");
glUniform3f(ray11Id, ray11.x, ray11.y, ray11.z);

GLuint camId = glGetUniformLocation(computeS, "eye");
glUniform3f(camId, camPos.x, camPos.y, camPos.z);

根據derhass建議更新答案。

我的圖像現在看起來像:最新圖像

glm 庫使用標准的 OpenGL 矩陣約定,這意味着創建Matrix * Vector時考慮到乘法順序Matrix * Vector 所以下面的代碼是錯誤的:

//Calculating inverse of the view*projection
glm::mat4 inv = glm::inverse(view*projection);

視圖矩陣(從世界空間轉換到眼睛空間)和投影矩陣(從眼睛空間轉換到剪輯空間)的組成是projection * view ,而不是你放置的view * projection (它將在視圖之前應用投影)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM