试图了解OpenGL中的像素和GL_POINTS

时间:2016-01-31 18:38:55

标签: c++ opengl

所以基本上我试图了解像素以及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;

所以我想我想要了解的是这里的光栅化过程

1 个答案:

答案 0 :(得分:1)

您假设点基元的面积为零是不正确的。

积分有大小。它们默认为1px,但可以通过glPointSize函数或gl_PointSize着色器变量更改其屏幕空间大小长度。

来自OpenGL wiki

  

将点光栅化为给定窗口空间大小的屏幕对齐方块。大小可以用两种方法给出:最后一个活动顶点处理着色器阶段或上下文状态。要从着色器设置磅值,请使用参数(glEnable)启用GL_PROGRAM_POINT_SIZE以从程序中设置磅值。如果启用了GL_PROGRAM_POINT_SIZE,则点大小来自输出变量float gl_PointSize。如果禁用,则对于基元中的所有点,点大小是常量,并由glPointSize​函数设置。

     

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