为什么OpenGL允许/使用小数值作为顶点的位置?

时间:2015-06-25 23:51:54

标签: opengl

据我了解,点/像素的位置不能只是一小部分,至少在光栅图形系统上,硬件使用像素来显示图像。

然后,为什么以及OpenGL如何使用小数值来绘制像素?

例如,如何实现:>>> d = dateutil.parser.parse('Wed Jun 24 20:19:10 PDT 2015') >>> (d - datetime.datetime(1970, 1, 1)).total_seconds() Traceback (most recent call last): ... TypeError: cant subtract offset-naive and offset-aware datetimes >>> # :( >>> (d - datetime.datetime(1970, 1, 1, tzinfo=d.tzinfo)).total_seconds() 1435177150.0 # UTC >>> ((d - datetime.datetime(1970, 1, 1, tzinfo=d.tzinfo)) - d.utcoffset()).total_seconds() 1435166350.0 # The original timezone

4 个答案:

答案 0 :(得分:6)

此命令不会绘制任何像素。它只是定义了3D空间中某个点的位置(您会注意到有3个坐标,而对于屏幕上的像素,您只需要2个坐标)。这是OpenGL管道的起点。然后,这一点在它最终出现在屏幕上之前会进行大量的转换。

此外,坐标是无单位的。例如,你可以说你的视口在0.0f和1.0f之间,那么这些坐标很有意义。基本上你必须从数学角度考虑这些观点,而不是像素。

我建议阅读一些关于OpenGL转换如何工作的内容,例如herehere或教程here

答案 1 :(得分:2)

传递给OpenGL的矢量不是视口位置,而是某些向量空间中的任意数字。只有在一系列变换之后,这些数字才会映射到视口像素位置。使用旧的固定功能管道,这可以是任何可以通过向量矩阵乘法表示的东西。

现在,一切都是可编程的(着色器),映射很可能是你能想到的任何一种功能。例如,传递给glVertex的值(立即模式调用,但可用于OpenGL-2.1的着色器)可以解释为顶点着色器中的极坐标:

这是一个完全有效的OpenGL-2.1顶点着色器,可将顶点位置解释为极坐标。请注意,由于三角形和直线是直边,而极坐标是曲线,因此只能为点或高度精细的基元提供良好的视觉效果。

#version 110

void main() {
    gl_Position =
          gl_ModelViewProjectionMatrix
        * vec4( gl_Vertex.y*vec2(sin(gl_Vertex.x),cos(gl_Vertex.x)) , 0, 1);
}

正如你在这里看到的那样,传递给glVertex的valus实际上是一些向量空间中向量的任意无单元组件。只有通过对视口空间应用一些变换,这些矢量才有意义。因此,它无法将某个值范围强加到进入顶点属性的值。

答案 2 :(得分:0)

对于您的示例,在屏幕上显示glVertex2f(0.15f,0.51f)之前,有许多变换要完成。在将顶点移动到视图空间(应用摄像机位置和方向)之后,使复杂的事情变得简单,这里的神奇之处在于(1)投影矩阵和(2)视口设置。

在内部,OpenGL“屏幕坐标”位于立方体(-1,-1,-1) - (1,1,1),:

http://www.matrix44.net/cms/wp-content/uploads/2011/03/ogl_coord_object_space_cube.png

投影矩阵'挤压'这个立方体中的平截头体(你在顶点着色器中做),假设你有透视变换 - 如果投影是正交的,投影只是一个管,受近和远值的限制(并且像两种情况,缩放因子):

http://www.songho.ca/opengl/files/gl_projectionmatrix01.png

编辑:也许更好的例子:

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/#The_Projection_matrix

(编辑:Z坐标用作深度值)当片段最终传输到纹理/帧缓冲区/屏幕上的像素时,这些像素与视口设置相乘:

https://www3.ntu.edu.sg/home/ehchua/programming/opengl/images/GL_2DViewportAspectRatio.png

希望这有帮助!

答案 3 :(得分:0)

顶点和像素是非常不同的东西。

很可能将所有顶点都放在一个像素内(尽管在这种情况下你可能需要LODing的帮助)。

你可能想从这里开始...... http://www.glprogramming.com/blue/ch01.html

...具体

  

基元由一组一个或多个顶点定义。顶点定义一个点,一条线的端点,或两条边相交的多边形的一角。数据(由顶点坐标,颜色,法线,纹理坐标和边缘标志组成)与顶点相关联,并且每个顶点及其相关数据按顺序和相同方式独立处理。

和...

  

光栅化使用点,线段或多边形的二维描述生成一系列帧缓冲区地址和关联值。这样生成的每个片段都被送入最后一个阶段,即每个片段操作,它在数据存储为帧缓冲区中的像素之前对数据执行最终操作。