- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经使用 OpenGL 和 GLUT 编写了一个小示例程序,以使用 glDrawPixels
函数显示由四个彩色方 block 组成的 2×2 网格。不幸的是,我发现:
以下 C++ 代码片段显示示例图像。我在这里做错了什么,我应该更改什么才能查看预期的颜色并旋转像素图?
struct RGB
{
unsigned char r, g, b;
};
class Pixmap
{
public:
RGB color[4];
Pixmap()
{
color[0].r = 255;
color[0].g = 0;
color[0].b = 0;
color[1].r = 0;
color[1].g = 255;
color[1].b = 0;
color[2].r = 0;
color[2].g = 0;
color[2].b = 255;
color[3].r = 255;
color[3].g = 255;
color[3].b = 255;
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawPixels( 2, 2, GL_RGB, GL_UNSIGNED_BYTE, color );
glFlush();
}
};
// Create an instance of class Pixmap
Pixmap myPixmap;
void myRender()
{
myPixmap.render();
}
int main( int argc, char *argv[] )
{
int screenWidth, screenHeight;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
screenWidth = glutGet(GLUT_SCREEN_WIDTH);
screenHeight = glutGet(GLUT_SCREEN_HEIGHT);
int windowWidth = screenHeight / 2;
int windowHeight = screenHeight / 2;
glutInitWindowSize(windowWidth, windowHeight);
int posX = (screenWidth - windowWidth) / 2;
int posY = (screenHeight - windowHeight) / 4;
glutInitWindowPosition(posX, posY);
glutCreateWindow("Picture");
GLfloat scaleX = 1.0f * windowWidth / 2;
GLfloat scaleY = 1.0f * windowHeight / 2;
glMatrixMode( GL_PROJECTION );
// If glPixelZoom(-scaleX, scaleY)
// then no image is displayed
glPixelZoom(scaleX, scaleY);
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glutDisplayFunc( myRender );
glutMainLoop();
}
最佳答案
经过一些实验,我认为我找到了一个似乎适合我自己目的的解决方案。首先,给出我上面问题中的示例代码,似乎需要将像素图传递给 glDrawPixels
用作数组 GLubyte color[2][2][4]
带有 alpha channel 。正如 Vaayu 所提到的,glMatrixMode
也有可能功能需要正确设置。其次,根据 pg。 OpenGL Programming Guide (7th Edition)的356,如果glPixelZoom
需要设置当前光栅位置使用负参数调用函数。本质上,为什么我看不到图像是由于光栅绘制在不在窗口可视区域内的位置。以下代码演示了如何为四种不同的情况设置旋转和当前光栅位置:
// case 0
glWindowPos2i(0, 0);
glPixelZoom(scaleX, scaleY);<p></p>
<p>// case 1
glWindowPos2i(windowHeight, 0);
glPixelZoom(-scaleX, scaleY);</p>
<p>// case 2
glWindowPos2i(0, windowHeight);
glPixelZoom(scaleX, -scaleY);</p>
<p>// case 3
glWindowPos2i(windowWidth, windowHeight);
glPixelZoom(-scaleX, -scaleY);
</p>
所以可以更新我原来问题中给出的例子:
class Pixmap{public: GLubyte color[2][2][4]; Pixmap() { // red color[0][0][0] = 255; color[0][0][1] = 0; color[0][0][2] = 0; color[0][0][3] = 0; // green color[0][1][0] = 0; color[0][1][1] = 255; color[0][1][2] = 0; color[0][1][3] = 0; // blue color[1][0][0] = 0; color[1][0][1] = 0; color[1][0][2] = 255; color[1][0][3] = 0; // white color[1][1][0] = 255; color[1][1][1] = 255; color[1][1][2] = 255; color[1][1][3] = 0; } void render() { glClear(GL_COLOR_BUFFER_BIT); glDrawPixels( 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, color ); glFlush(); }};// Create an instance of class PixmapPixmap myPixmap;void myRender(){ myPixmap.render();}int main( int argc, char *argv[] ){ int screenWidth, screenHeight; int rotation; // Choose rotation case {0, 1, 2, 3} rotation = 3; glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); screenWidth = glutGet(GLUT_SCREEN_WIDTH); screenHeight = glutGet(GLUT_SCREEN_HEIGHT); int windowWidth = screenHeight / 2; int windowHeight = screenHeight / 2; glutInitWindowSize(windowWidth, windowHeight); int posX = (screenWidth - windowWidth) / 2; int posY = (screenHeight - windowHeight) / 4; glutInitWindowPosition(posX, posY); glutCreateWindow("Picture"); GLfloat scaleX = 1.0f * windowWidth / 2; GLfloat scaleY = 1.0f * windowHeight / 2; glMatrixMode(GL_MODELVIEW); // Select rotation switch(rotation) { case 0: glWindowPos2i(0, 0); glPixelZoom(scaleX, scaleY); break; case 1: glWindowPos2i(windowHeight, 0); glPixelZoom(-scaleX, scaleY); break; case 2: glWindowPos2i(0, windowHeight); glPixelZoom(scaleX, -scaleY); break; case 3: glWindowPos2i(windowWidth, windowHeight); glPixelZoom(-scaleX, -scaleY); break; default: break; } glClearColor(1.0, 1.0, 1.0, 0.0); glColor3f(0.0f, 0.0f, 0.0f); glutDisplayFunc( myRender ); glutMainLoop();}
关于c++ - 使用 glDrawPixels 显示像素图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593283/
我一直在尝试使用 java 和 lwjgl 在 opengl 中绘制 320 x 240 全屏分辨率的图像。我将分辨率设置为 640 x 480,并将像素大小加倍以填充空间。经过大量的谷歌搜索后,我发
基本上我正在做一些测试来模拟场景中的各种窗口。一切正常,直到我尝试更好地定位我在场景中绘制的窗口。 重要代码在这里: // camFront = glReadPixels ... glMatrixMo
我是图形编程新手。我正在尝试使用 glDrawPixels 进行绘图,但我的程序没有任何输出。我在网上进行了研究,关于我应该将哪些数据传递给 glDrawPixels,我不断得到不同的答案。我看过 d
我正在尝试使用 OpenGL 函数 glDrawPixels() 渲染体积数据 #define SIZE 480 unsigned int rgbPixels[SIZE][SIZE] ..
我有一张像这样渲染的图像: glDrawPixels(image->width, image->height, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
我必须使用 glDrawPixels 来实现光栅算法。 现在我只是想得到一个 glDrawPixels 工作但有问题的简单示例。 GLint height, width, size = 0; GLby
这是代码。输出是一个灰色的方 block ——一直都是,不管输入是什么,而且明显是错误的。我的目标是能够将所有像素存储在某个地方并显示它们,这样我就可以继续使用简单的光线追踪器,但我似乎无法弄清楚这个
我已经使用 OpenGL 和 GLUT 编写了一个小示例程序,以使用 glDrawPixels 函数显示由四个彩色方 block 组成的 2×2 网格。不幸的是,我发现: 网格中的颜色显示不正确;和
将 glDrawPixels() 与 glRasterPos2*() 和 glPixelZoom() 结合使用时,我得到了非常奇怪的结果。我有一张照片,我想像过去的旧帧缓冲区一样显示它,即 (0,0)
我的团队目前仅限于在 opengl 1.4 平台上绘制图像,这意味着我们不能使用任何漂亮的纹理映射来绘制图像(是的,我们仅限于使用 intel 集成图形平台,这很烦人)。到目前为止,我们能够绘制、缩放
根据 opengl 规范 4.0 glDrawPixels 已弃用。 对于 cuda 互操作性,似乎最好使用“opengl 缓冲区对象”。 (替代方案可以是纹理或表面,但它们存在缓存/并发问题,因此无
我正在尝试用opengl画康威的生命游戏。它在常规 pygame 中工作得很好,但我读到 glTexImage2D 是快速绘制数组中已有内容的方法。我已经查看了the examples and doc
这个问题已经有答案了: glDrawArrays only updates when i exit (1 个回答) 已关闭 2 年前。 我创建了要使用 glDrawPixels 绘制的像素缓冲区。代码
以下代码不向 Intel 集成视频卡(例如 MacBook)的后台缓冲区写入任何数据。在 ATI 卡上,例如在 iMac 上,它绘制到后台缓冲区。宽度和高度正确(和 800x600 缓冲区)并且 m_
谁能看出这段代码有什么问题? SIZE_BG 是 6MB,因为我正在尝试绘制大型位图图像 (3366x600)。我使用 malloc 来防止我的图像溢出堆栈。我在调用 glDrawPixels() 时
我目前正在使用 OpenGL 开发适用于 Windows 的视频播放器。效果很好,但我的主要目标之一是准确性。也就是说,显示的图像应该与保存为视频的图像完全相同。 去掉所有与视频/文件/输入相关的东西
我现在对 glDrawPixels() 函数感到困惑。我知道函数签名是这样的:gl.glDrawPixels(int 宽度, int 高度, 格式, 类型, 数据); 我不知道如何使格式类型数据保持一
我正在尝试使用 numpy 和 OpenGL 可视化 mandelbrot 集。但是我在绘制代码时遇到问题,即 glDrawPixels。 当我使用 glDrawPixels 绘制时,我得到一些黑色的
我有一个函数可以在窗口上逐一绘制像素,但我想知道的是如何让像素以红色以外的其他颜色绘制。提前致谢。我已经尝试了一些东西,例如 glSetColor、glColor3f 等。只是尝试让像素以不同的颜色显
我有一个三维数组 unsigned int window_RGBData[3][640][480]; void display(){ glClear(GL_COLOR_BUFFER_BIT |
我是一名优秀的程序员,十分优秀!