所以基本上我试图了解像素以及OpenGL在使用GL_POINTS渲染它们时如何处理它们(如果它也适用于纹理缓冲区):
这是渲染到屏幕后结果的上传图像(我试图放置更小的但我只允许两个链接)
http://i.imgur.com/hcdloMD.png
http://i.imgur.com/9GBtK9m.png
从这里开始是我编写的程序及其结果,当我更改下面提到的值时:
这里是处理上传像素并更新它们的代码,主要关注值变量,当我改变它时,我改变了图片的大小
glDisable(GL_POINT_SMOOTH);
int i = 0, j=0, k=0;
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLfloat point[3] = {-1.0f, -1.0f, 0.0f};
GLfloat color[3];
float value = 3.0f;
float incrementX = value/640.0f;
float incrementY = value/480.0f;
while(j<256){
//initialize starting position for x for each line
point[0] = -1.0f;
//run the width
while(k<256){
//upload vertex position to GL server
glVertexAttrib3fv(0,point);
//deals with updating colour
color[2] = data[i+0]/255.0f; //B
color[1] = data[i+1]/255.0f; //G
color[0] = data[i+2]/255.0f; //R
//upload texture data to GL server
glVertexAttrib3fv(1, color);
//draws array
glDrawArrays(GL_POINTS, 0, 1);
//deals with updating incrementors
point[0]+=incrementX; //moving forward in appropriate units for the size of width
k++;
i+=3;
}
//restart width
k=0;;
j++;
//update height
point[1]+=incrementY;
}
glXSwapBuffers ( dpy, glxWin );
sleep(6);
我的问题是关于实际像素
据我所知,这个点实际上没有区域,opengl看到的所有点都是2d平面中的位置,它可以理解当它放大时会发生什么
然而,当我使图像变得越来越小时,我对像素级别变得越来越小时发生的事情感到困惑,让我们说它倾向于0,即0.000001
屏幕上的像素肯定有限制吗?
这是否意味着opengl实际上划分像素以使图像适合于它是给定像素的正常尺寸的1/100?
因为图像可以越来越小到点
当然,opengl还没有将各个颜色绘制到屏幕上一个像素的部分上吗?或者是重复绘制到一个像素时迭代的颜色,因为点位置始终只在一个像素内?或者是否将一个像素进一步划分为更小的像素尺寸?
编辑:
我对没有大小的点的假设不是假设,而是我从红皮书中读到的#34;
&#34;点由单个顶点表示。顶点表示四维齐次坐标中的点。 因此,一个点实际上没有区域,因此在OpenGL中它实际上是显示器(或绘制缓冲区)的方形区域的模拟。当渲染点时,OpenGL确定 使用一组称为规则的点覆盖哪些像素 光栅化规则。在OpenGL中栅格化点的规则是相当的 直截了当 - 如果一个样本落在以窗口坐标中该点位置为中心的正方形内,则该样本被视为被一个点覆盖。&#34;
所以我想我想要了解的是这里的光栅化过程
答案 0 :(得分:1)
您假设点基元的面积为零是不正确的。
积分有大小。它们默认为1px,但可以通过glPointSize
函数或gl_PointSize
着色器变量更改其屏幕空间大小长度。
来自OpenGL wiki:
将点光栅化为给定窗口空间大小的屏幕对齐方块。大小可以用两种方法给出:最后一个活动顶点处理着色器阶段或上下文状态。要从着色器设置磅值,请使用参数(
glEnable
)启用GL_PROGRAM_POINT_SIZE
以从程序中设置磅值。如果启用了GL_PROGRAM_POINT_SIZE
,则点大小来自输出变量floatgl_PointSize
。如果禁用,则对于基元中的所有点,点大小是常量,并由glPointSize
函数设置。大小定义了点的正方形每边所占的窗口像素数。点的位置定义了该正方形的中心。