Opengl glPolygonStipple参数的二进制转换

Opengl glPolygonStipple参数的二进制转换,opengl,Opengl,我正在努力学习语言,在那个网站上有一个关于如何使用glPolygonStipple的例子。我的理解是GLubyte数组中的十六进制数被用来转换成二进制数,这样就可以生成位图。我只是想知道这些数组中的元素究竟是如何形成这些模式的 以下是网站上的示例: #include <Windows.h> #include <GL/gl.h> #include <GL/glut.h> void display(void) { GLubyte fly[] = { 0x00

我正在努力学习语言,在那个网站上有一个关于如何使用glPolygonStipple的例子。我的理解是GLubyte数组中的十六进制数被用来转换成二进制数,这样就可以生成位图。我只是想知道这些数组中的元素究竟是如何形成这些模式的

以下是网站上的示例:

#include <Windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
void display(void)
 {
GLubyte fly[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, 
  0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, 
  0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,
  0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22, 
  0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 
  0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
  0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 
  0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC, 
  0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,
  0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0, 
  0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0, 
  0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30,
  0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08, 
  0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08, 
  0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08};
GLubyte halftone[] = {
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55};

glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);

/*  draw one solid, unstippled rectangle,       */      
/*  then two stippled rectangles                */
glRectf (25.0, 25.0, 125.0, 125.0);
glEnable (GL_POLYGON_STIPPLE);
glPolygonStipple (fly);
glRectf (125.0, 25.0, 225.0, 125.0);
glPolygonStipple (halftone);
glRectf (225.0, 25.0, 325.0, 125.0);
glDisable (GL_POLYGON_STIPPLE);

glFlush ();
}

void init (void) 
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);    
}

void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}

int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize (350, 150);
  glutCreateWindow (argv[0]);
  init ();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMainLoop();
  return 0;  
}
#包括
#包括
#包括
作废显示(作废)
{
GLubyte fly[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x80,0x01,0xC0,0x06,0xC0,0x03,0x60,
0x04、0x60、0x06、0x20、0x04、0x30、0x0C、0x20、,
0x04,0x18,0x18,0x20,0x04,0x0C,0x30,0x20,
0x04、0x06、0x60、0x20、0x44、0x03、0xC0、0x22,
0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22,
0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22,
0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22,
0x66、0x01、0x80、0x66、0x33、0x01、0x80、0xCC,
0x19、0x81、0x81、0x98、0x0C、0xC1、0x83、0x30,
0x07、0xe1、0x87、0xe0、0x03、0x3f、0xfc、0xc0、,
0x03,0x31,0x8c,0xc0,0x03,0x33,0xcc,0xc0,
0x06、0x64、0x26、0x60、0x0c、0xcc、0x33、0x30,
0x18、0xcc、0x33、0x18、0x10、0xc4、0x23、0x08,
0x10、0x63、0xC6、0x08、0x10、0x30、0x0c、0x08、,
0x10、0x18、0x18、0x08、0x10、0x00、0x00、0x08};
GLubyte半色调[]={
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55};
glClear(GLU颜色缓冲位);
GL3F(1.0,1.0,1.0);
/*绘制一个实心的未剥离矩形,*/
/*然后是两个点画矩形*/
glRectf(25.0,25.0,125.0,125.0);
glEnable(GL_多边形_点画);
果蝇;
glRectf(125.0,25.0,225.0,125.0);
glPolygonStipple(半色调);
glRectf(225.0,25.0,325.0,125.0);
glDisable(GL_多边形_点画);
glFlush();
}
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GLU平面);
}
空洞重塑(整数w,整数h)
{
GLVIEW(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(350150);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMainLoop();
返回0;
}

二进制是以2为基数的数字系统,这意味着每个数字都是0或1。这非常适合点画模式,因为0表示“不绘制此像素”,1表示“绘制此像素”。在多边形上使用的点画图案是二维的,因此您有几行0和1,形成一个像素图案

具体来说,您有32行,每行32个二进制数字(位)

不幸的是,你不能把二进制数输入到C语言和C++语言的源代码中。通常使用十六进制。这是一个以16为基数的数字系统,因此每个数字可以是0-9或a-F(字母a-F表示十进制值10-15)

它的好处在于,每个数字整齐地对应于一个由4个二进制数字(或位)组成的模式。这使得转换非常容易。以下是它们的对应方式:

Hex  Binary
0    0000
1    0001
2    0010
3    0011
4    0100
5    0101
6    0110
7    0111
8    1000
9    1001
A    1010
B    1011
C    1100
D    1101
E    1110
F    1111
(如果你不熟悉数字是如何用二进制表示的,那可能看起来很奇怪。如果你想了解更多细节,网上应该有很多教程和解释。)

当您看到一个十六进制数,比如0x31,您可以首先忽略“0x”前缀——它只表示该数字是十六进制的。要计算二进制等价物,只需查找表中的其他数字,一次查找一个,即可得到二进制等价物。在本例中,它是3后跟1,这意味着二进制模式是
0011 0001
(不带空格)

在点画模式中,这意味着它将保留2个像素空白,绘制2个像素,保留3个像素空白,最后绘制1个像素

在您发布的示例代码中,您可以看到几对十六进制数字。每个十六进制对提供8个二进制位(或1个字节)。这意味着4对连续的十六进制数字是32位,这是点画图案的一个完整行。总共有32行


值得注意的是,示例代码的格式有点混乱。每行源代码显示8个十六进制对。不过OpenGL并不关心这一点。它只看到一个连续的数字数组,每行分成32位。

哦,天哪,关于多边形点画的问题?在我的有生之年都不会想到读到这样的东西。作为一般性建议,不要试图从20年前的书籍中学习OpenGL,也不要浪费时间去理解过去15年中没有人使用过的功能(即使是以前)。;-)@ChristianRau多边形点画在某些领域仍有应用。无论如何,这不是一种高端效果,但像简单的可视化系统(最新的图形并不重要)这样的东西有时仍然使用它,因为它非常简单和高效。看起来非常高效。现在一切都有意义了。