C++ 如何在OpenGL中绘制单个像素?
有人能告诉我如何在坐标(100200)处绘制一个白色像素吗 我正在使用GLUT,到目前为止,我已经知道如何打开一个空白窗口。一旦我知道了如何绘制像素,我将使用它来实现。(是的,我知道OpenGL可以画线。我需要自己实现这一点)C++ 如何在OpenGL中绘制单个像素?,c++,opengl,C++,Opengl,有人能告诉我如何在坐标(100200)处绘制一个白色像素吗 我正在使用GLUT,到目前为止,我已经知道如何打开一个空白窗口。一旦我知道了如何绘制像素,我将使用它来实现。(是的,我知道OpenGL可以画线。我需要自己实现这一点) #包括 #包括 静态int-win(0); int main(int argc,char*argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE); glutInitWindow
#包括
#包括
静态int-win(0);
int main(int argc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(500500);
位置(100100);
//步骤2.打开名为“GLUT DEMO”的窗口
win=glutCreateWindow(“GLUT演示”);
glClearColor(0.0,0.0,0.0,0.0);//设置背景
glClear(GLU颜色缓冲位);
glFlush();
glutMainLoop();
}
这是一行神奇的代码,花了整整一天的时间阅读stackoverflow和观看youtube教程来学习:
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:
glEnable(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);
}
使用首选方法(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坐标和颜色,以便在屏幕上绘制单个像素。请随意查看代码:这是OpenGL的一个奇怪的功能,而不是它的设计目的。为什么要用OpenGL呢?我想你可以用线像素创建一个纹理,并用该纹理绘制一个三角形/四边形,或者你可以为每个像素渲染一个点。你需要使用不推荐的传统OpenGL 1.0还是可以使用现代OpenGL v3.3或更高版本?这也是一个有效的答案,不过,请注意,你可以绘制不止一个像素,如果glPointSize不是1(默认情况下为1)。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
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);