opengl dfdx dfdy
生活随笔
收集整理的這篇文章主要介紹了
opengl dfdx dfdy
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文是關于偏導數函數dfdx、dfdy的個人實驗理解,如有錯誤,請各位留言指正!
參考文檔:
https://segmentfault.com/a/1190000019681666?utm_source=tag-newest
https://blog.csdn.net/herramadeus/article/details/21037503
個人認為偏導數是一個物體空間坐標與物體所渲染的屏幕坐標的一個比值。請看下面具體的驗證。
頂點著色器:
#version 430 corelayout(location = 0) in vec4 vPosition;layout(location = 1) in vec2 UV;layout(location = 0) uniform mat4 MVP;out vec2 texUV;void main(){ texUV = UV;gl_Position = MVP*vPosition; }片段著色器:
#version 430 corelayout(location = 1) uniform float fdx;in vec2 texUV;out vec4 fColor;void main(){ float dp = 100.0;dp = dFdx(texUV).x;//根據偏導數數值進行渲染 因為浮點精度問題,不能直接相等//UV的寬度為1if(dp >= fdx-0.0001 && dp <= fdx + 0.0001 ){ fColor = vec4(0.0, 0.0, 1.0, 1.0); }else {fColor = vec4(1.0, 0.0, 0.0, 1.0); }}程序設置:
//平面的空間坐標GLfloat vertices[NumVertices][3] = {{ -0.5f, -0.5f, 0.0f},{ 0.5f, -0.5f, 0.0f},{ 0.5f, 0.5f, 0.0f},{ -0.5f, 0.5f, 0.0f},};//平面的UV坐標GLfloat uv[NumVertices][2] = {{ 0.0f, 0.0f},{ 1.0f, 0.0f},{ 1.0f, 1.0f},{ 0.0f, 1.0f}};glViewport(0, 0, 500, 500);vmath::mat4 modelView = vmath::mat4::identity(); modelView = vmath::frustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100) * vmath::translate(0.0f, 0.0f, -1.0f);glUniformMatrix4fv(0,1,false,modelView);//平面處于視錐近平面上,近平面上下寬高為2,平面寬高為1,視口寬高為500,平面渲染寬高為250//UV的寬高為1,UV的偏導數應為1.0/250.0glUniform1f(1, 1.0/250.0f);
物體渲染受平移,旋轉,縮放的影響,分別進行測試。
平移/綻放:
modelView = vmath::frustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100) * vmath::translate(0.0f, 0.0f, -2.0f);//modelView = vmath::frustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100) * vmath::translate(0.0f, 0.0f, -1.0f)// * vmath::scale(0.5f,0.5f,0.5f);glUniformMatrix4fv(0,1,false,modelView);//遠離(縮小)了一倍,渲染寬高應為125glUniform1f(1, 1.0/125.0);旋轉:
vmath::mat4 modelView = vmath::mat4::identity(); modelView = vmath::frustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100) * vmath::translate(0.0f, 0.0f, -1.0f) * vmath::rotate(60.0f, 0.0f, 0.0f, 1.0f); glUniformMatrix4fv(0,1,false,modelView);//斜向上還是250個像素,一個UV單位,60度的旋轉,投影到水平是0.5glUniform1f(1, 0.5/250.0);
以上純屬個人見解!!
Note that the functions dFdx, dFdy, fwidth, and their Coarse and Fine variations will return 0, when given a constant expression as an argument.
總結
以上是生活随笔為你收集整理的opengl dfdx dfdy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马化腾:没有“备胎”会永远被人掐住喉咙
- 下一篇: staircase nim 经典组合游戏