如何在OpenGL中绘制单个像素?
Posted
技术标签:
【中文标题】如何在OpenGL中绘制单个像素?【英文标题】:How to draw a single pixel in OpenGL? 【发布时间】:2017-02-23 01:27:41 【问题描述】:有人能告诉我如何在坐标(例如 (100,200))处绘制单个白色像素吗?
我正在使用 GLUT,到目前为止,我已经弄清楚如何打开一个空白窗口。一旦我弄清楚如何绘制像素,我将使用它来实现Bresenham line drawing algorithm。 (是的,我知道 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();
【问题讨论】:
这对于 OpenGL 来说是一件奇怪的事情,而不是它的设计目的。你为什么要使用OpenGL呢?我想您可以使用线条像素创建纹理并使用该纹理绘制三角形/四边形,或者您可以为每个像素渲染一个点。 您需要使用已弃用的旧版 OpenGL 1.0 还是可以使用现代 OpenGL v3.3 或更高版本? 【参考方案1】: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();
【讨论】:
也是一个有效的答案,但请注意,如果 glPointSize 不为 1(默认情况下),您可以绘制的不仅仅是一个像素。 请注意,据我了解 OpenGL,此答案使用旧代码。运行它的设备的驱动程序必须支持 OpenGL 的兼容性配置文件才能正常工作。【参考方案2】:使用现代 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 初始化后,创建一个四边形(实际上是两个三角形)以覆盖整个屏幕,例如:
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
【讨论】:
【参考方案3】:这可以通过设置剪刀矩形来轻松完成,然后清除,这只会清除剪刀矩形中的指定区域。例如:
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中绘制单个像素?的主要内容,如果未能解决你的问题,请参考以下文章