C 在OpenGL中,我可以在坐标(5,5)处绘制一个像素吗?

C 在OpenGL中,我可以在坐标(5,5)处绘制一个像素吗?,c,opengl,glut,C,Opengl,Glut,我所说的(5,5)正是指第五行和第五列 我发现使用屏幕坐标很难画东西,OpenGL中的所有坐标都是相对的,通常在-1.0到1.0之间。为什么阻止程序员使用屏幕坐标/窗口坐标如此严重?几年前我做过一些3D编程,虽然我不是专家,但我认为您忽略了经典位图DrawPixel(x,y)之间的一个非常重要的区别图形和使用Direct3D和OpenGL完成的图形类型 早在3D之前,计算机图形学主要是关于位图的,也就是说彩色点的集合。这些点与显示器上的像素有1:1的关系 然而,这有许多缺点,包括使3D变得非常困

我所说的(5,5)正是指第五行和第五列


我发现使用屏幕坐标很难画东西,OpenGL中的所有坐标都是相对的,通常在-1.0到1.0之间。为什么阻止程序员使用屏幕坐标/窗口坐标如此严重?

几年前我做过一些3D编程,虽然我不是专家,但我认为您忽略了经典位图
DrawPixel(x,y)之间的一个非常重要的区别
图形和使用Direct3D和OpenGL完成的图形类型

早在3D之前,计算机图形学主要是关于位图的,也就是说彩色点的集合。这些点与显示器上的像素有1:1的关系

然而,这有许多缺点,包括使3D变得非常困难,以及需要不同大小的位图以实现不同的显示分辨率

在OpenGL/D3D中,您正在处理矢量图形。直线由三维坐标空间中的点定义,形状由直线定义,等等。曲面可以具有纹理,可以添加灯光,以及各种类型的照明效果等。然后可以通过虚拟摄影机查看整个场景或其中的一部分

通过这个虚拟相机,你“看到”的是场景在2D表面上的投影。我们现在仍然在处理矢量图形。但是,由于计算机显示由离散像素组成,因此必须对该矢量图像进行光栅化,从而将矢量转换为具有实际像素的位图

总而言之,您不能使用屏幕/窗口坐标,因为OpenGL是基于矢量图形的。

您可以通过将modelview矩阵设置为identity,将投影设置为正交投影(请参见上的我的回答),更改“相机”使3D坐标与屏幕坐标匹配。然后,您可以在所需的屏幕坐标处绘制一个单点基本体


您还可以使用
glWindowPos
(与
glRasterPos
)设置光栅位置,然后只需使用
glDrawPixels
绘制1x1像素图像。

最简单的方法可能是通过设置投影以匹配渲染空间的像素尺寸。然后顶点可以是像素坐标。缺点是,调整窗口的大小可能会导致问题,而您主要是在浪费加速的转换

假设窗口为640x480:

// You can reverse the 0,480 arguments depending on you Y-axis 
// direction preference
glOrtho(0, 640, 0, 480, -1, 1);

帧缓冲区对象和纹理是另一种途径,但您必须创建自己的光栅化例程(绘制线、圆、位图等)。这有可能是lib。

@dandan78 OpenGL不是矢量图形渲染器。这是一个光栅化器。更准确地说,是一个用C语言接口描述的标准。光栅化器将三维坐标空间(汽车、树、球体、龙)中表示的对象映射到二维坐标空间(例如平面、应用程序窗口或显示器),这些二维坐标属于离散坐标平面。光栅化的反渲染方法是光线跟踪

矢量图形是一种通过数学函数以非离散方式表示一组曲线、直线或类似几何图元的方法。因此,矢量图形是在“模型表示”字段中,而不是在“渲染”字段中


通过更改glScissor的最后两个参数,您还可以绘制像素完美矩形。

那么谁将OpenGL处理的矢量数据光栅化?如果是OpenGL本身,我认为它至少应该留下一些API让用户稍微修改最终结果,或者最好留下一个窗口让用户读/写像素缓冲区。你可以分配一个帧缓冲区对象,将你的场景渲染到其中,然后用它完成所有你想要的像素绘制工作。也就是说,将OpenGL坐标映射到视口坐标非常容易:
glViewport(win\u offset\u x,win\u offset\u y,win\u width,win\u height);glMatrixMode(GL_投影);glLoadIdentity();glOrtho(win_offset_x,win_offset_x+win_宽度,win_offset_y,win_offset_y+win_高度,-1,1);glMatrixMode(GLU模型视图);glLoadIdentity()等等,OpenGL坐标现在映射到视口像素坐标。哇,这是公认的答案吗?它甚至没有回答这个问题,它只是说,“你试图做的是不可能的”,这是一个彻头彻尾的谎言。这个答案和任何人投票超过它的事实真的让我很生气。因为使用[-1..1]而不是[0..800]也可以在1024p屏幕上工作。但是既然你知道屏幕的大小,就按照datenwolf和basszero说的去做。当计算机科学标准由数学家设计时,就会出现OpenGL。如果有CS人员和UX人员在场,他们将包括设置分辨率的简单功能、文本模式和开箱即用的功能。谢谢!互联网似乎对此保持沉默。几乎十年过去了,但这应该是公认的答案。
glEnable( GL_SCISSOR_TEST );
glScissor( 5, 5, 1, 1 ); /// position of pixel
glClearColor( 1.0f, 1.0f, 1.0f, 0.0f ); /// color of pixel
glClear( GL_COLOR_BUFFER_BIT );
glDisable( GL_SCISSOR_TEST );