[英]OpenGL far clipping when using frustum
我正在使用GLFW + OpenGL嘗試制作“旋轉立方體”。 盡管大多數都能正常工作,但我在遠端進行了裁剪。 我嘗試將視錐的值更改為非常大的數字,但這似乎沒有效果。
int main(void) {
if (!glfwInit()) exit(EXIT_FAILURE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
GLFWwindow* window = glfwCreateWindow(640, 360, "3dTest", NULL, NULL);
if (!window) {
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); // Grey Background
float rotqube = 0;
while (!glfwWindowShouldClose(window)) {
// clear color and depth buffer for new frame
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// set up camera
glViewport(0, 0, 640, 360);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
// position camera
glTranslatef(0.0f, 0.0f, -2.0f); // Translate Into The Screen 2.0 Units
glRotatef(rotqube, 0.0f, 1.0f, 0.0f); // Rotate The cube around the Y axis
glRotatef(rotqube, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS); // Draw The Cube Using quads
glColor3f(0.0f, 1.0f, 0.0f); // Color Blue
glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
...
glColor3f(1.0f, 0.0f, 1.0f); // Color Violet
glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Right)
glVertex3f(1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)
glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Right)
glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Right)
glEnd(); // End Drawing The Cube
rotqube += 0.3f;
//Swap buffer and check for events
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate;
exit(EXIT_SUCCESS);
return 0;
}
看起來是這樣的:
glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
^ wat
參數:
left
,right
:指定左右垂直剪切平面的坐標。
bottom
,top
:指定底部和頂部水平裁剪平面的坐標。
nearVal
,farVal
:指定到近景和遠景裁剪平面的距離。
兩個距離都必須為正。
嘗試類似0.1
到100.0
:
glFrustum(-100.0, 100.0, -100.0, 100.0, 0.1, 100.0);
您根本沒有使用透視投影。 您的來電
glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
除了設置GL_INVALID_VALUE
錯誤狀態外, 沒有任何作用 。
如OpenGL 2.0規范第2.11節“坐標轉換”所述:
對於
void Frustum( double l, double r, double b, double t, double n, double f );
坐標
(l, b, −n)^T
和(r, t, −n)^T
指定分別在近裁剪平面上映射到窗口左下角和右上角的點(假設眼睛位於(0, 0, 0)^T
)。f
給出了從眼睛到遠裁剪平面的距離。 如果n
或f
小於或等於零 ,l
等於r
,b
等於t
或n
等於f
, 則會產生錯誤INVALID_VALUE
。
嘗試在近平面或遠平面之一位於攝影機后面的位置設置投影沒有絲毫意義,並且會在渲染過程中導致很多數學上的奇數(即,將位於攝影機平面上的頂點除以零),因此這個不允許。
由於此函數會因錯誤而失敗,因此您將使用單位矩陣作為投影矩陣,並且最終以正交投影結束。
編寫完所有這些內容之后,我必須使您知道所有這些內容已經完全過時了。 固定功能流水線和GL矩陣堆棧,包括類似功能glFrustum
, glLoadIdendity
, glRotate
使用,和立即模式渲染glBegin
/ glEnd
被棄用,大約十年前已經被去除的OpenGL形式芯輪廓。 嘗試在2018年學習這些知識是一個非常糟糕的主意,我強烈建議您改為學習現代OpenGL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.