glViewport

glViewport MSHelp/:link { color:#0000ff; text-decoration:underline; cursor:hand; hoverColor:#3366ff; filterString: ;}

 

zz http://blog.163.com/xuwenqiang_114/blog/static/104695801200912242250531/

void glViewport( GLint x,

                       GLint y,

                       GLsizei width,

                       GLsizei height)

参数

     x,y 指定视口矩形的左下角坐标,单位为像素.缺省值为(0,0).

     width,height  指定视口矩形的宽度和高度.

说明

     glViewport函数指定x和y从单位设备坐标到窗口坐标的转换,令(x_nd,y_nd)为单位设备坐标,那么计算到的窗口坐标(x_w,y_w)为:

     x_w = (x_nd + 1)[width/2] + x

     y_x  = (y_nd + 1)[height/2] + y

    根据实现,视口的宽度和高充被箝位在某一范围,这个范围使用glGet命令,变量为GL_MAX_VIEWPORT_DIMS进行查询.

    下列函数用来检索与glViewport相关的信息:

    glGet,变量为 GL_VIEWPORT.

    glGet,变量为 GL_MAX_VIEWPORT_DIMS.

错误

    如果width或height的值为负数,则会产生GL_INVALID_VALUE错误;

    如果在glBegin和对应的glEnd语句之间调用glViewport函数,则会产生GL_INVALID_OPERATION错误.

 

 

不认识的单词:

respectively、分别

affine、仿射

clamp 夹紧、固定

 

需要了解的:

glGet函数

 

需要回忆的:

为什么需要坐标变换?有哪几种坐标变换,windows坐标变换的函数是什么?

### glViewport 函数的详细用法和参数说明 `glViewport` 是 OpenGL 中用于设置视口(Viewport)的一个重要函数。它定义了窗口中一个矩形区域,该区域将接收从标准化设备坐标(Normalized Device Coordinates, NDC)变换而来的屏幕空间坐标。以下是关于 `glViewport` 的详细说明: #### 1. 函数原型 ```c void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); ``` #### 2. 参数解释 - **x** 和 **y**: 指定视口左下角在窗口中的位置,单位为像素[^1]。 - `x` 表示视口左边缘相对于窗口左边缘的偏移量。 - `y` 表示视口下边缘相对于窗口下边缘的偏移量。 - **width** 和 **height**: 指定视口的宽度和高度,单位为像素。 - 如果 `width` 或 `height` 设置为零或负数,则视口不会被更新[^2]。 #### 3. 功能描述 `glViewport` 的主要作用是将经过投影矩阵变换后的标准化设备坐标(范围为 [-1, 1])映射到窗口中的实际像素坐标。其公式如下: - 屏幕空间的 X 坐标: \[ x_{\text{screen}} = (x_{\text{ndc}} + 1) \times \frac{\text{width}}{2} + x \] - 屏幕空间的 Y 坐标: \[ y_{\text{screen}} = (y_{\text{ndc}} + 1) \times \frac{\text{height}}{2} + y \] 其中,\(x_{\text{ndc}}\) 和 \(y_{\text{ndc}}\) 是标准化设备坐标[^2]。 #### 4. 使用注意事项 - 调用 `glClear(GL_COLOR_BUFFER_BIT)` 清屏时,不能放置在循环内部,否则会导致每次迭代都覆盖之前绘制的内容[^1]。 - 视口的大小应与窗口的实际尺寸相匹配,以避免图像拉伸或变形。如果需要绘制多个子视图,则可以通过多次调用 `glViewport` 来实现[^1]。 #### 5. 示例代码 以下是一个简单的使用 `glViewport` 的示例: ```c #include <GL/glew.h> #include <GLFW/glfw3.h> void setupViewport(int width, int height) { glViewport(0, 0, width, height); // 设置视口为整个窗口 } int main() { if (!glfwInit()) return -1; GLFWwindow* window = glfwCreateWindow(800, 600, "Viewport Example", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); int screenWidth, screenHeight; glfwGetFramebufferSize(window, &screenWidth, &screenHeight); setupViewport(screenWidth, screenHeight); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT); // 绘制内容... glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; } ``` #### 6. 相关概念 - **标准化设备坐标(NDC)**: OpenGL 中所有顶点经过模型视图投影矩阵变换后,会被映射到 [-1, 1] 的范围内[^2]。 - **深度缓冲区(Z-buffer)**: 在视口变换中,深度信息会被保留并存储在 Z 缓冲区中,用于隐藏表面消除(Hidden Surface Removal)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值