Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OpenGL中绘制单个像素?_C++_Opengl - Fatal编程技术网

C++ 如何在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

有人能告诉我如何在坐标(100200)处绘制一个白色像素吗

我正在使用GLUT,到目前为止,我已经知道如何打开一个空白窗口。一旦我知道了如何绘制像素,我将使用它来实现。(是的,我知道OpenGL可以画线。我需要自己实现这一点)

#包括
#包括
静态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);