试图理解 OpenGL 中的像素和 GL_POINTS
Posted
技术标签:
【中文标题】试图理解 OpenGL 中的像素和 GL_POINTS【英文标题】:Trying to understand pixels and GL_POINTS in OpenGL 【发布时间】:2016-01-31 18:38:55 【问题描述】:所以基本上我想了解像素以及 OpenGL 在使用 GL_POINTS 渲染它们时如何处理它们(如果它也适用于纹理缓冲区):
这是渲染到屏幕后上传的结果图片(我尝试放更多较小的,但我只允许两个链接)
从这里开始是我写的一个程序,当我改变下面提到的值时它的结果:
这里是处理上传像素和更新它们的代码,主要关注值变量,当我改变它时,我会改变图片的大小
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
屏幕上的像素肯定有限制吗?
这是否意味着当图像是给定像素正常大小的 1/100 时,opengl 实际上会划分像素以使图像适合?
因为图像可以越来越小到一个点
当然,opengl 还没有将单独的颜色绘制到屏幕上一个像素的部分?还是它迭代的颜色被重复绘制到一个像素,因为点位置总是只在一个像素内?
还是将一个像素进一步划分为更小的像素尺寸?
编辑:
我对没有大小的点的假设不是假设,而是我从“红皮书”中读到的
"点由单个顶点表示。顶点表示四维齐次坐标中的一个点。因此,一个点实际上是没有面积的,所以在OpenGL中它实际上是一个正方形区域的模拟显示(或绘图缓冲区)。 渲染点时,OpenGL 确定 使用一组称为规则的点覆盖了哪些像素 光栅化规则。在OpenGL中栅格化一个点的规则是相当的 直截了当——如果样本落在以窗口坐标中点的位置为中心的正方形内,则认为该样本被该点覆盖。"
所以我想我想了解的是这里的光栅化过程
【问题讨论】:
【参考方案1】:您关于点基元面积为零的假设是不正确的。
点有大小。它们默认为 1px,但它们的屏幕空间大小长度可以通过 glPointSize
函数或 gl_PointSize
着色器变量进行更改。
来自OpenGL wiki:
点被光栅化为给定窗口空间大小的屏幕对齐正方形。大小可以通过两种方法给出:通过最后一个活动顶点处理着色器阶段或通过上下文的状态。要从着色器设置点大小,请启用带有参数 (
GL_PROGRAM_POINT_SIZE
) 的glEnable
以从程序设置点大小。如果启用GL_PROGRAM_POINT_SIZE
,则点大小来自输出变量floatgl_PointSize
。如果禁用,则图元中所有点的点大小都是恒定的,并由glPointSize
函数设置。大小定义了点的正方形每一边占据的窗口像素数。该点的位置定义了该正方形的中心。
【讨论】:
我试图理解“屏幕对齐”是什么意思...当顶点不在像素中心时,1px 基元能否产生 2 或 4 个片段?以上是关于试图理解 OpenGL 中的像素和 GL_POINTS的主要内容,如果未能解决你的问题,请参考以下文章