试图理解 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,则点大小来自输出变量float gl_PointSize。如果禁用,则图元中所有点的点大小都是恒定的,并由glPointSize​ 函数设置。

大小定义了点的正方形每一边占据的窗口像素数。该点的位置定义了该正方形的中心。

【讨论】:

我试图理解“屏幕对齐”是什么意思...当顶点不在像素中心时,1px 基元能否产生 2 或 4 个片段?

以上是关于试图理解 OpenGL 中的像素和 GL_POINTS的主要内容,如果未能解决你的问题,请参考以下文章

Android OpenGL ES----理解纹理与纹理过滤

尝试为opengl创建像素化着色器失败

OpenGL像素阵列函数

OpenGL 3.x / 4x 中的纹素/像素匹配

使用 openGL 和/或 X11 的屏幕截图

亮度滤波器opengl中的多彩噪声