如何对 OPENGL 顶点数组进行赋值? 即glArrayElement(i) 如何运算?

如何对 OPENGL 顶点数组进行赋值? 即glArrayElement(i) 如何运算?,第1张

//初始化
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT,0,normals); //float normals[][3]
glVertexPointer(3,GL_FLOAT,0,vertices); //float vertices[][3]

//显示

for(int j=0;j<3;j++)
{
int idx=face_indicies[i][j];
// glNormal3fv(&normals[idx][0]);
// glVertex3fv(&vertices[idx][0]);
glArrayElement(idx);//获取当前所有已启用数组的一个顶点数据
}
------
或者把glBegin到End以及2个for替换成
glDrawElements(GL_TRIANGLES,
(sizeof(face_indicies)/sizeof(face_indicies),
GL_UNSIGNED_INT, // unsigned int face_indicies[][]
face_indicies);

OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。
DirectX是一种应用程序接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。
HDTV是High Definition Television的简称,翻译成中文是“高清晰度电视”的意思,HDTV技术源之于DTV(Digital Television)“数字电视”技术,HDTV技术和DTV技术都是采用数字信号,而HDTV技术则属于DTV的最高标准,拥有最佳的视频、音频效果。HDTV与当前采用模拟信号传输的传统电视系统不同,HDTV采用了数字信号传输。由于HDTV从电视节目的采集、制作到电视节目的传输,以及到用户终端的接收全部实现数字化,因此HDTV给我们带来了极高的清晰度,分辨率最高可达1920×1080,帧率高达60fps,是足够让目前的DVD汗颜的。除此之外,HDTV的屏幕宽高比也由原先的4:3变成了16:9,若使用大屏幕显示则有亲临影院的感觉。同时由于运用了数字技术,信号抗噪能力也大大加强,在声音系统上,HDTV支持杜比51声道传送,带给人Hi-Fi级别的听觉享受。和模拟电视相比,数字电视具有高清晰画面、高保真立体声伴音、电视信号可以存储、可与计算机完成多媒体系统、频率资源利用充分等多种优点,诸多的优点也必然推动HDTV成为家庭影院的主力。

一个一个像素的读写太慢了吧, opengl只支持一堆像素的读写。
void glReadPixels();
glDrawPixels();
当然你用他们来读写一个像素也可以只不过有点大材小用
void glReadPixels(GLint x,GLint y,GLsizesi width,GLsizei height,
GLenum format,GLenum type,GLvoid pixel);
函数参数(x, y)定义图像区域左下角点的坐标,width和height分别是图像的高度和宽度,pixel是一个指针,指向存储图像数据的数组。参数format指出所读象素数据元素的格式(索引值或R、G、B、A值,如下面表所示),而参数type指出每个元素的数据类型(也见下面表)。
写入象素数据:
void glDrawPixels(GLsizesi width,GLsizei height,GLenum format,
GLenum type,GLvoid pixel);
函数参数format和type与glReadPixels()有相同的意义,pixel指向的数组包含所要画的象素数据。注意,调用这个函数前必须先设置当前光栅位置,若当前光栅位置无效,则给出该函数时不画任何图形,并且当前光栅位置仍然保持无效。
+++++++++++像素格式表++++++++++++++++++++++
GL_INDEX 单个颜色索引
GL_RGB 先是红色分量,再是绿色分量,然后是蓝色分量
GL_RED 单个红色分量
GL_GREEN 单个绿色分量
GL_BLUE 单个蓝色分量
GL_ALPHA 单个Alpha值
GL_LUMINANCE_ALPHA 先是亮度分量,然后是Alpha值
GL_STENCIL_INDEX 单个的模板索引
GL_DEPTH_COMPONENT 单个深度分量
++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++ 数据类型+++++++++++++++++++
GL_UNSIGNED_BYTE 无符号的8位整数
GL_BYTE 8位整数
GL_BITMAP 无符号的8位整数数组中的单个数位
GL_UNSIGNED_SHORT 无符号的16位整数
GL_SHORT 16位整数
GL_UNSIGNED_INT 无符号的32位整数
GL_INT 32位整数
GL_FLOAT 单精度浮点数
+++++++++++++++++++++++++++++++++++++++
图像的每个元素按上面表给出的数据类型存储。若元素表示连续的值,如红、绿、蓝或亮度分量,每个值都按比例放缩使之适合于可用的位数。例如,红色分量是00到10之 间的浮点值。若它需要放到无符号单字节整数中,也仅有8位精度保存下来,其他无符号整数类型同理。对于有符号的数据类型还要少一位,例如颜色索引存到有符号的8位整数中,它的第一位被0xfe屏蔽掉了(即这个掩码包含7个1)。若类型是GL_FLOAT,索引值简单地转化成单精度浮点值,例如索引17转化成170,同理。

是两个不同的库,OpenCV是一个基于(开源)发行的跨平台计算机视觉库,OpenGL(全写OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。

给你举个例子吧:(以下内容摘自网络)

gluLookAt(00,00,50, 00,00,00, 00,10,00); 相当于我们的脑袋位置在(00,00,50)处,眼睛望向(00,00,00),即原点。后面的三个参数(00,10,00),y轴为1,其余为0,表示脑袋朝上,就是正常的情况。看到的情况如下图:

壶嘴在右,壶柄在坐,壶底在下,壶盖在上。

二、若将gluLookAt的后三个参数设置为(00,-10,00),即y轴为-1,其余为0。这样表示脑袋向下,即人眼倒着看,看到的效果如下图:

三、再次修改gluLookAt的后三个参数为(10,00,00);x轴为1,其余为0即人的脑袋像右歪90度来看,即顺时针转90度(换个角度思考就是壶逆时针转90度),猜想看到的结果应该是壶嘴在上,壶盖在右,壶底在左,壶柄在下。如下图:

其余情况依次类推。再次重述gluLookAt的参数,前三个参数表示的是脑袋的位置,中间三个参数是人眼的朝向,后三个位置表示的是脑袋朝向的方向。

for (int i = 0;i<3;i++)
for(int j =0;j<3;j++)
{
charpoints[i][j][0] = WX;
charpoints[i][j][1] = WY;
charpoints[i][j][2] = WZ;
}
charpoints[i][j][k] = {{{wx,wy,wz}}};
这个是不合法的。对数组的赋值,除非在初始化时能用{}去整体赋值,其他时候都只能对单个元素赋值。

   去年就一直有一个想法,把cesium引擎用opengl重新实现一遍,当时考虑的跨平台路线是通过Emscripten把桌面语言编译成js然后在浏览器运行。为啥会想到做这个呢?就是考虑到cesium在前端加载的性能和效果,基于OpenGL底层的话会有更好的性能,不受浏览器性能限制种种

   基本把cesium功能都搬进来了,除了GIS球部分,还有影像、地形服务,有3dtiles数据加载,也有cesium的billboard,polyline,label等API。

    底层基于OpenGL45,和浏览器单线程不同,这套桌面引擎也用上了多线程

    但是有一个问题,虽然有一个性能很强的桌面端引擎,但是现在主流需求都是浏览器加载。之前也用到了跨平台技术Emscripten转成js,但是性能毕竟也不理想。没法和桌面性能和效果相比。后面就考虑了走云渲染路线也实现一套跨平台。后面也成功实现了。

    也就是可以包含cesium所有的功能,而且还有桌面的性能和效果。个人觉得比现在市面上一些云渲染要好一点,比如51world基于UE4,虽然效果很好,但是底层是商业引擎,也没有数字地球。

    

    

 

    


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

原文地址: http://outofmemory.cn/yw/13401253.html

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

发表评论

登录后才能评论

评论列表(0条)

保存