如何在OpenGL中绘制单个像素

How to draw a single pixel in OpenGL?

本文关键字:绘制 单个 像素 OpenGL      更新时间:2023-10-16

有人可以告诉我如何在坐标上绘制一个白色像素,例如(100,200)?

我正在使用Glut,到目前为止,我已经弄清楚了如何打开空白窗口。一旦我弄清楚如何绘制像素,我将使用它来实现Bresenham线图算法。(是的,我知道OpenGL可以绘制线路。我需要自己实施)。

#include <stdio.h>
#include <GL/glut.h>
static int win(0);
int main(int argc, char* argv[]){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    //step 2. Open a window named "GLUT DEMO"
    win = glutCreateWindow("GLUT DEMO");
    glClearColor(0.0,0.0,0.0,0.0); //set background
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
    glutMainLoop();
}

glVertex2i(x,y);

这是它需要工作的上下文:

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(80, 80);
glutInitWindowSize(500,500);
glutCreateWindow("A Simple OpenGL Program");
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D( 0.0, 500.0, 500.0,0.0 );
glBegin(GL_POINTS);
   glColor3f(1,1,1);
   glVertex2i(100,100);
glEnd();

这可以通过设置剪刀矩形然后清除来轻松完成,然后清除剪刀矩形中的指定区域。例如:

glEnable(GL_SCISSOR_TEST);
glScissor(100, 200, 1, 1);
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
// Remember to disable scissor test, or, perhaps reset the scissor rectangle:
glDisable(GL_SCISSOR_TEST); 

使用现代OpenGL您可以将glScissor()与填充整个屏幕的四边形组合。

着色器可以像:

一样简单
// Vertex Shader
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
// Fragment Shader
#version 330 core
out vec4 FragColor;
uniform vec4 inColor;
void main()
{
    FragColor = inColor;
}

使用您的首选方法(GLFW,GLAD,GLEN等)进行OpenGL和Windows初始化后,创建一个Quad(实际上是两个三角形)以覆盖整个屏幕,例如:

float vertices[] = {
    -1.0f, -1.0f, 0.0f,
     1.0f, -1.0f, 0.0f,
     1.0f,  1.0f, 0.0f,
    -1.0f, -1.0f, 0.0f,
     1.0f,  1.0f, 0.0f,
    -1.0f,  1.0f, 0.0f
};

然后创建缓冲区,编译着着色器并绑定着着色器程序和VAO。
然后使用:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

您的绘图代码看起来像这样绘制X = 100的绿色像素,Y = 100:

GLint transformLoc = glGetUniformLocation(shaderProgramId, "inColor");
glUniform4f(transformLoc, 0.0f, 1.0f, 0.0f, 1.0f);
glEnable(GL_SCISSOR_TEST);
glScissor(100, 100, 1, 1); // position of pixel
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisable(GL_SCISSOR_TEST);

我写了一个在OpenGL顶部构建的小图形渲染类,其代码可以很好地完成。它的核心函数是PutPixel(),它接收X/Y坐标和颜色以在屏幕上绘制单个像素。随时查看代码:https://github.com/amengol/mingl