为啥OpenGL中要用GLfloat而不用float,两者有啥区别呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥OpenGL中要用GLfloat而不用float,两者有啥区别呢?相关的知识,希望对你有一定的参考价值。

如题,还有在csgl中,好像没有GLfloat了,是这样吗?

int,float 和 GLint,GLfloat 它们是一样的。
但是用 float ,编译器不同,内存大小可能设为32 or 64 位的,用GLfloat 就不会出现这种问题。.

typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef signed char GLbyte;
typedef short GLshort;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned int GLuint;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
参考技术A OpenGL通过一种求值器的机制来产生曲线和曲面,该机制非常灵活,可以生成任意角度的多项式曲线,并可以将其他类型的多边形曲线和曲面转换成贝塞尔曲线和曲面。这些求值器能在任何度的曲线及曲面上计算指定数目的点。随后,OpenGL利用曲线和曲面上的点生成标准OpenGL图元,例如与曲线或曲面近似的线段和多边形。由于可让OpenGL计算在曲线上所需的任意数量的点,因此可以达到应用所需的精度。
对于曲线,OpenGL中使用glMap1*()函数来创建一维求值器,该函数原型为:

void glMap1fd(GLenum target,TYPE u1,TYPE u2,
GLint stride, GLint order,const TYPE *points);

函数的第一个参数target指出控制顶点的意义以及在参数points中需要提供多少值,具体值见表一所示。参数points指针可以指向控制点集、RGBA颜色值或纹理坐标串等。例如若target是GL_MAP1_COLOR_4,则就能在RGBA四维空间中生成一条带有颜色信息的曲线,这在数据场可视化中应用极广。参数u1和u2,指明变量U的范围,U一般从0变化到1。参数stride是跨度,表示在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量,比如上例中的控制点集ctrpoint[4][3]的跨度就为3,即单个控制点的坐标元素个数。函数参数order是次数加 1,叫阶数,与控制点数一致。

参数 意义
GL_MAP1_VERTEX_3 x,y,z顶点坐标
GL_MAP1_VERTEX_4 x,y,z,w 顶点坐标
GL_MAP1_INDEX 颜色表
GL_MAP1_COLOR_4 R,G,B,A
GL_MAP1_NORMAL 法向量
GL_MAP1_TEXTURE_COORD_1 s 纹理坐标
GL_MAP1_TEXTURE_COORD_2 s,t 纹理坐标
GL_MAP1_TEXTURE_COORD_3 s,t,r 纹理坐标
GL_MAP1_TEXTURE_COORD_4 s,t,r,q 纹理坐标

表一、参数target的取值表

使用求值器定义曲线后,必须要启动求值器,才能进行下一步的绘制工作。启动函数仍是glEnable(),其中参数与glMap1*()的第一个参数一致。同样,关闭函数为glDisable(),参数也一样。

一旦启动一个或多个求值器,我们就可以构造近似曲线了。最简单的方法是通过调用计算坐标函数glEvalcoord1*()替换所有对函数glVertex*()的调用。与glVertex*()使用二维、三维和四维坐标不同,glEvalcoord1*()将u值传给所有已启动的求值器,然后由这些已启动的求值器生成坐标、法向量、颜色或纹理坐标。OpenGL曲线坐标计算的函数形式如下:

void glEvalCoord1fd[v](TYPE u);

该函数产生曲线坐标值并绘制。参数u是定义域内的值,这个函数调用一次只产生一个坐标。在使用glEvalCoord1*()计算坐标,因为u可取定义域内的任意值,所以由此计算出的坐标值也是任意的。

使用glEvalCoord1*()函数的优点是,可以对U使用任意值,然而,如果想对u使用N个不同的值,就必须对glEvalCoord1*()函数执行N次调用,为此,OpenGL提供了等间隔值取值法,即先调用glMapGrid1*()定义一个间隔相等的一维网格,然后再用glEvalMesh1()通过一次函数执行,将求值器应用在网格上,计算相应的坐标值。下面详细解释这两个函数:

1、void glMapGrid1fd(GLint n,TYPE u1,TYPE u2);

定义一个网格,从u1到u2分为n步,它们是等间隔的。实际上,这个函数定义的是参数空间网格。

2、void glEvalMesh1(GLenum mode,GLint p1,GLint p2);

计算并绘制坐标点。参数mode可以是GL_POINT或GL_LINE,即沿曲线绘制点或沿曲线绘制相连的线段。这个函数的调用效果同在p1和p2之间的每一步给出一个glEvalCoord1()的效果一样。从编程角度来说,除了当i=0或i=n,它准确以u1或u2作为参数调用glEvalCoord1()之外,它等价于一下代码:

glBegin(GL_POINT); /* glBegin(GL_LINE_STRIP); */
for(i=p1;i <=p2;i++)
glEvalCoord1(u1+i*(u2-u1)/n);
glEnd();

为了进一步说明OpenGL中曲线的绘制方法。下面我们来看一个简单的例子,这是用四个控制顶点来画一条三次Bezier曲线。程序如下(注:这是本讲座中提供的第一个完整的OpenGL实例代码,如果读者朋友对整个程序结构有些迷惑的话,也不要紧,慢慢地往下看,先有一个感官上的印象,主要是掌握如何实现曲线绘制这一部分。关于OpenGL的程序整体结构实现,笔者将在第五讲中专门阐述):

#include "glos.h"
#include
#include
#include
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
GLfloat ctrlpoints[4][3] =
-4.0, -4.0, 0.0 , -2.0, 4.0, 0.0 ,
2.0, -4.0, 0.0 , 4.0, 4.0, 0.0
;
void myinit(void)

glClearColor(0.0, 0.0, 0.0, 1.0);
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4,
&ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glShadeModel(GL_FLAT);

void CALLBACK display(void)

int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat) i/30.0);
glEnd();
/* 显示控制点 */
glPointSize(5.0);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POINTS);
for (i = 0; i < 4; i++)
glVertex3fv(&ctrlpoints[i][0]);
glEnd();
glFlush();

void CALLBACK myReshape(GLsizei w, GLsizei h)

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

为啥 APP 要用 token 而不用

你对 TOKEN 和 SESSION 的理解有误。

SESSION 是服务器通过 Key-Value 对来保存数据的一种机制,比如 APP 的登录状态可以用 SESSION 来保存。

TOKEN 翻译过来叫令牌,令牌是什么意思?可以拿现实中的令牌对比,现实中的令牌起到通行证的作用,而这在服务端也是一样的。我们在登录后,服务端使用 SESSION 保存我们的登录状态,并把 SESSION 的 Key 返回给客户端,那么这个 Key 就成为我们的令牌(TOKEN),我们以后再访问数据,就直接把这个 TOKEN 随着请求一起发送给服务端,这样服务端通过这个 TOKEN 在 SESSION 中查找数据,如果有就说明 TOKEN 有效(就像你去旅游,关口认可你的通行证),并取出你的登录数据,利用你的用户信息(保存在登录数据内)查出你想要的内容。

实际上 TOKEN 的校验会更复杂,上面只是给出一个简单的例子方便理解。
参考技术A session
和 oauth token 并不矛盾,作为身份认证 token
安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态

以上是关于为啥OpenGL中要用GLfloat而不用float,两者有啥区别呢?的主要内容,如果未能解决你的问题,请参考以下文章

Opengl - GLfloat未被识别

为啥 APP 要用 token 而不用

OpenGL第十三节:矩阵变换

在vue项目开发中, 为啥图片要用require 引入。。。而不是直接写本地路径

为啥要用Jupyter

为啥要用dbus,如果不用dbus要用啥来代替?