使用 glDrawPixels() 在 OpenGL 上绘制像素

Posted

技术标签:

【中文标题】使用 glDrawPixels() 在 OpenGL 上绘制像素【英文标题】:Drawing a Pixel on OpenGL using glDrawPixels() 【发布时间】:2018-10-08 00:16:06 【问题描述】:

我想用 C++ 制作 makePixel(...) 函数,它可以在指定的 x 和 y 中放置一个像素。但我不知道为什么我的方法不起作用。

#include "glut.h"

int WIDTH, HEIGHT = 400;
GLubyte* PixelBuffer = new GLubyte[WIDTH * HEIGHT * 3];

void display();


int main(int argc, char *argv[])

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

    glutInitWindowSize(WIDTH, HEIGHT); 
    glutInitWindowPosition(100, 100); 

    int MainWindow = glutCreateWindow("Hello Graphics!!"); 
    glClearColor(0.5, 0.5, 0.5, 0);

    makePixel(200,200,0,0,0,PixelBuffer);

    glutDisplayFunc(display); 
    glutMainLoop();
    return 0;




void display()

    glClear(GL_COLOR_BUFFER_BIT);
    glDrawPixels(WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, PixelBuffer);
    glFlush(); 

在“glut.h”中

void makePixel(int x, int y, int r, int g, int b, GLubyte* pixels)

    if (0 <= x && x < window.width && 0 <= y && y < window.height) 
        int position = (x + y * window.width) * 3;
        pixels[position] = r;
        pixels[position + 1] = g;
        pixels[position + 2] = b;
    

【问题讨论】:

【参考方案1】:

int WIDTH, HEIGHT = 400; 仅将 400 分配给 HEIGHT,而不是 HEIGHTWIDTH,就像您的代码假设的那样。 WIDTH 未初始化(或者可能是默认构造的,我不确定在这种情况下 C++ 规范要求什么;我在运行时在我的系统上得到 0)。

大家一起:

#include <GL/glut.h>

int WIDTH = 400;
int HEIGHT = 400;
GLubyte* PixelBuffer = new GLubyte[WIDTH * HEIGHT * 3];

void display()

    glClear(GL_COLOR_BUFFER_BIT);
    glDrawPixels(WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, PixelBuffer);
    glutSwapBuffers(); 


void makePixel(int x, int y, int r, int g, int b, GLubyte* pixels, int width, int height)

    if (0 <= x && x < width && 0 <= y && y < height) 
        int position = (x + y * width) * 3;
        pixels[position] = r;
        pixels[position + 1] = g;
        pixels[position + 2] = b;
    


int main(int argc, char *argv[])

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowSize(WIDTH, HEIGHT); 
    glutInitWindowPosition(100, 100); 

    int MainWindow = glutCreateWindow("Hello Graphics!!"); 
    glClearColor(0.0, 0.0, 0.0, 0);

    makePixel(200,200,255,255,255,PixelBuffer, WIDTH, HEIGHT);
    glutDisplayFunc(display); 
    glutMainLoop();
    return 0;

【讨论】:

以上是关于使用 glDrawPixels() 在 OpenGL 上绘制像素的主要内容,如果未能解决你的问题,请参考以下文章

glDrawPixels() 与 0.375 翻译

malloc() 和 glDrawPixels() 的访问冲突?

glDrawPixels 访问冲突读取位置

有没有办法使用 glDrawPixels 渲染单通道灰度图像?

灰度的glDrawPixels?

优化流媒体vbo openg