openGL中glmap()函数的用法,用途等

openGL中glmap()函数的用法,用途等,第1张

http://devyeskycom/460/2116960shtml

我也是前几天才刚看到的,希望对你有用。

有可能它对函数参数的文字解释不够清楚,你对着下面的程序来就好理解些。

上一节已经搭建好了开发环境,在正式学习如何用OpenGL前,我们先了解一下OpenGL的基础知识。

一、OpenGL是什么

一般它被认为是一个API,包含了一系列的函数,用来 *** 作各种图形图像。事实上并不是,OpenGL仅仅是一个由一个名为Khronos组织制定并维护的规范。但是,我宁愿把它当成是API来理解,因为规范严格规定了OpenGL各函数的输入和输出,内部细节都是开发者自行决定。那么以API来理解,我认为是很合理的。(其实OpenGL函数大多是各显卡厂商开发的,所以如果你在用OpenGL开发过程中如果遇到问题,可以尝试更新显卡驱动的方式来解决,当然,前提是你还要确定一下显卡厂商)

如果你想了解OpenGL规范细节,可以访问https://wwwopenglorg/registry/doc/glspec33core20100311withchangespdf。

二、状态机

OpenGL是一个状态机,无论是官方信息还是网络上的信息,都解释的比较繁琐和复杂。

我认为,可以这么理解,当我们用OpenGL去绘制一个三角形时,要把OpenGL当前状态设置成可以绘制三角形的状态,比如颜色、线条啥的,渲染就出来三角形了。如果又想绘制线段了,就把OpenGL当前状态再设置成线段的状态,就可以渲染出线段了。

说白了,就是想绘制啥,就把状态设置先设置成啥,这就是状态机。(这是我自己理解的,哈哈)

三、核心模式与立即渲染模式

OpenGL32之前,它都是立即渲染模式,32之后,它使用了核心模式,抛弃了立即渲染模式。

那么什么是立即渲染模式,什么是核心模式呢?

我查了网上很多资料,都没有把这个事情说清楚,我通过各种文章,是这么理解的:

立即渲染模式是类似这样:

glBegin( GL_TRIANGLES );

    glVertex3f(-10f, -05f, -40f);

    glVertex3f( 10f, -05f, -40f);

    glVertex3f( 00f, 05f, -40f);

glEnd();

上面是绘制三角形的,具体可以不用追究。只要明白,设置好点,放在glBegin和glEnd之间,就能渲染出来三角形了。这就是立即渲染模式。

而核心模式就要关注细节了,它是如何用点和颜色渲染图形的,都需要开发者参与设计。

暂时我就理解到这个程度,后续边学边理解吧。

四、对象

OpenGL库是用C语言写的,我们知道C语言是面向过程的,之前的OpenGL也是面向过程的,比如,绘制一个图形,就要设置好顶点和颜色,如果再绘制一个,就要再设置一次。而OpenGL引入“对象(Object)”后,就方便多了。比如:

// 创建对象

unsigned int objectId = 0;

glGenObject(1, &objectId);

// 绑定对象至上下文

glBindObject(GL_WINDOW_TARGET, objectId);

// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项

glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);

glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);

// 将上下文对象设回默认

glBindObject(GL_WINDOW_TARGET, 0);

上面这段是在网上抄过来的,不过,说明很详细,我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文(就是设置内容,比如颜色、大小等等)的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

说白了,就是,创建一个对象,先用一个ID保存起来,并设置好内容,想用了,将这个ID跟设置目标(比如GL_WINDOW_TARGET)绑定,就可以用了,不用每次都重新设置。

好了,这次了解了一些OpenGL的基础,下一次就可以开心正式学习OpenGL了。

1、修改顶点着色器让三角形上下颠倒;

2、使用uniform定义一个水平偏移量,在顶点着色器中使用这个偏移量把三角形移动到屏幕右侧。

  着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵 *** 作的有用特性。

  着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。

  虽然着色器是各自独立的小程序,但是它们都是一个整体的一部分,出于这样的原因,我们希望每个着色器都有输入和输出,这样才能进行数据交流和传递。

  GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。但在顶点和片段着色器中会有点不同。

  如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。

  Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

1、顶点坐标的 Y 值 乘以 -1,即 使三角形反转。(图形向量转换)

2、 渲染阶段,在程序中设定offset 值,传送给着色器。

3、glGetUniformLocation方法:获取着色器程序中,指定为uniform类型变量的id。

4、glUniform1f(GLint location, GLfloat v0); location指明要更改的uniform变量的位置;v0指明在指定的uniform变量中要使用的新值。

5、offset = 05

glUniform1f(glGetUniformLocation(selfprogram, "xOffset"), offset);将05的值赋给GLSL程序中的xOffset变量。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11672036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存