openGL 程序运行后窗口里面没东西,已经不止一次了。下面是代码,求解答。

openGL 程序运行后窗口里面没东西,已经不止一次了。下面是代码,求解答。,第1张

先来回答你的问题。

无法显示的原因,投影设置的视见体没有将你定义的矩形模型包括在内。

直观来讲,你可以将gluOrtho2D试着调整为:

gluOrtho2D(-100,3000,-100,3000);同时设置背景为黑色,则得到效果:

进步一解释:

OpenGL中图形成像依赖于你定义的模型,比如你设置的4个position1

量以及投影时设置的投影参数,比如你用的gluOrtho2D。

你的代码中模型和投影参数设置都不是很理想,使用gluOrtho2D设置的正交投影裁剪平面的范围

(0,400,300,1500);没有将你要显示的矩形模型包括在显示区域内,因此无法渲染。

注意设置适当的参数,这是初学者需要耐心学习的。你的代码看起来很混乱,最好采用一本适当教材(红宝书),或者跟着一个教程(搜索 OpenGL tutorial)实际动手学习。

对于这个例子,同时思考: 为什么是三角形而不是矩形?

为什么我之前的图形没有显示出来?

GPUImage的核心是的处理和渲染,而这个过程主要是由OpenGL ES实现的。但是OpenGL ES是一个C API的集合,用起来非常不方便。GLProgram就提供了一个建立OpenGL ES program的面向对象封装。

一个OpenGL ES Program的创建过程主要分为以下步骤

在OpenGL中,对于同一个Program的渲染必须发生在同一个EGLContext上。所以在整个OpenGL渲染过程中,我们需要先创建一个EGLContext并设置为currentContext。

在iOS中,创建EGLContext相对比较容易,因为已经有一个系统自带的EAGLContext类将EGL都封装好了,只需要调用其initializer并且将这个Context设置成 currentContext 即可:

而在安卓中,则创建Context要麻烦许多。因为安卓要求所有的渲染必须发生在同一个Context以及同一个线程中。如果不使用默认的GLSurfaceView进行渲染的话,则需要更复杂的创建Context的过程:

创建 GLProgram 包括了上述的步骤2-步骤5。 GLProgram 的initializer有多个:

其实他们最终都是传入了两个参数,即Vertex Shader以及Fragment Shader。有了这两个Shader之后,我们就可以开始创建OpenGL ES的Program了。

创建并且compile shader的过程包括几步:

在GPUImage中,实际上attribute的index并不是真正从program中获取到的,而是直接通过默认的顺序进行排序的。因为我们可以真正通过使用 glBindAttribLocation 和 glEnableVertexAttribArray 来控制每个Attribute的位置。

因此,如果需要写一个Filter的子类,需要先调用父类中的addAttributes方法,才能够保证正确的Attribute index。

在GPUImageFilter中,有两个attributes的位置是固定的:

在OpenGL ES中,uniform的位置并不是固定的,必须在Program link完成之后才能够获得,因此,获取uniform的位置必须通过以下命令:

由于在渲染过程中,很可能添加了多个Program,因此,很可能出现的情况就是需要在不同的Program之间进行切换。切换的命令很简单:

一旦调用了这个方法,就会将当前的program设置为正在使用中的,然后进行渲染。

由于GPUImage默认是进行处理,其实它的VertexShader就相对简单很多,因此,GPUImage提供了一个默认的VertexShader:

同时,也提供了一个不进行任何像素 *** 作的PassThrough FragmentShader:

GLProgram主要是提供了对OpenGL ES program创建以及使用的面向对象化封装。真正进行渲染的Shader都是由不同的Filter自己提供的。在了解了GLProgram之后,我们就可以开始正式进入主题GPUImageFilter了。

强力推荐《OpenGL游戏程序设计》作者:K霍金 D阿斯特第1篇 OpenGL和DirectX的介绍

第1章 而今迈步从头越--OpenGL和Directx

11 开发游戏需要理由吗

12 3D游戏世界

13 游戏的元素

14 开发工具

15 什么是openGL

151 OpenGL的历史

152 OpenGL的体系结构

153 OpenGL实用库

154 什么是GLUT

155 轻松一瞥

16 什么是DirectX

161 DirectX的历史

162 DirectX体系结构

17 0penGL与DirectX

本章小结

第2章 Windows *** 作系统平台上的OpenGL编程

21 Windows编程介绍

211 Windows应用程序基础

212从WinMain()开始

213 Windows Procedure

214 窗口类

215 窗口类的注册

216 窗口的创建

217 消息循环

218 一个完整的Windows应用程序

22 WGL介绍

221 绘制环境

222 WGL的使用

23 像素格式

231 nSize

232 dwFlag

233 iPixel lype

234 cColorBits

24 0penGL windOWS应用程序

25 全屏OpenGL

本章小结

第3章 3D图形学理论概览

31 标量、点和矢量

311 矢量的大小

312 矢量的归一化

313 矢量加法运算

314 矢量与标量的乘法运算

315 点积运算

316 叉积运算

32 矩阵

321 单位矩阵

322 零矩阵

323 矩阵加法和减法运算

324 矩阵乘法运算

325 矩阵的总体实现

33 变换

331 平移变换

332 旋转变换

333 缩放变换

34 投影

341 平行投影

342 透视投影

35 3D剪裁

36 光照

361 环境光

362 散射光

363 镜面反射光

37 纹理映射

本章小结

第2篇 使用OpenGL

第4章 OpenGL状态和图元

41 状态函数

42 图元的处理

421 3D空间中点的绘制

422 3D空间中线的绘制

423 3D空间中的多边形的绘制

424 图元的使用

本章小结

第5章 坐标变换和OpenGL矩阵

51 理解坐标变换

511 视点和眼坐标

512 视图变换

513 模型变换

514 投影变换

515 视区变换

52 OpenGL和矩阵

521 模型视图矩阵

522 平移变换

523 旋转变换

524 缩放变换

525 矩阵堆栈

526 机器人例程

53 投影变换

531 正交投影变换

532 透视投影变换

533 视区的设置

534 投影变换实例

54 白定义矩阵的使用

541 自定义矩阵的载入

542 矩阵的乘法运算

543 自定义矩阵的实例

本章小结

第6章 添加颜色、混合与光照

61 颜色是如何工作的

62 在OpenGL中使用颜色

621 颜色深度

622 颜色立方体模型

623 OpenGL中的RGBA模式

624 OpenGL中的颜色索引模式

63 明暗处理

64 OpenGL中的光照

641 OpenGL光照和现实世界

642 材质

643 法线

644 OpenGL光照的使用

65 颜色混合

透明度

本章小结

第7章 位图、图像与OpenG L

71 0penGL位图

711 位图的定位

712 位图的绘制

713 一个OpenGL位图例程

72 图像的使用

721 图像数据的绘制

722 屏幕的读取

723 屏幕数据的复制

724 放大、缩小和翻转

73 像素存储的管理

74 WindOWS位图

741 BMP文件格式

742 BMP文件的载入

743 BMP文件的输

75 Targa图像文件

751 Targa文件格式

752 Targa文件的载入

753 Targa文件的输出

本章小结

第8章 纹理映射

81 纹理映射的概览

82 纹理图的应用

821 2D纹理

822 lD纹理

823 3D纹理

83 纹理对象

831 纹理名字的生成

832 纹理对象的创建和使用

84 纹理的过滤处理

85 纹理模式

86 纹理坐标

861 重复和夹持纹理

862 mipmap和细节层次

863 mipmap的自动牛成

87 例程--飘动的旗帜

871 例程的解释说明

872 例程的实现

88 例程--高程纹理地形

881 例程的解释说明

882 例程的实现

本章小结

第9章 高级纹理映射

91 多纹理映射

911 多纹理支持的验证

912 扩展函数的访问

913 纹理单元的建市

914 纹理坐标的设置(指定)

915 综合应用

92 环境映射

93 纹理矩阵

94 光照映射

95 多通道多纹理映射

本章小结

第1O章 显示列表与顶点数组

lO1 显示列表

1011 显示列表的创建

1012 向显示列表中填充命令

1013 显示列表的执行

1014 显示列表的注意事项

1015 显示列表的销毁

1016 显示列表与纹理

1017 例程:使用显示列表的机器人演示程序

lO2 顶点数组

1021 顶点数组的启用

1022 数组的使用

1023 顶点数组与多纹理映射

1024 数组的锁定

1025 例程:再建地形演示程序

本章小结

第11章 文本的显示

111 位图字体

l12 轮廓字体

ll3 纹理映射字体

本章小结

第12章 OpenGL缓存

121 什么是OpenGL缓存

1211 像素格式的设置

1212 缓存的清理

122 颜色缓存

1221 双缓存系统

1222 立体缓存

123 深度缓存

1231 深度比较程序

1232 深度缓存的使用

l24 模板缓存

l25 累积缓存

本章小结

第13章 OpenGL二次曲面

131 OpenGL二次曲面的基础

l311 绘制风格

1312 法线

1313 指向

1314 纹理坐标

1315 清理

132 圆盘

l33 圆柱

l34 球

135 例程:飞掠一个二次世界

本章小结

第14章 曲线与曲面

141 曲线与曲面的描述

1411 参数方程

1412 控制点与连续性

l42 求值程序

143 曲面

144 NURBS

本章小结

第15章 特殊效果

l51 标志板

152 粒子系统的使用

1521 粒子

l522 粒子系统

1523 粒子系统管理器

1524 实例

l525 粒子系统的效果

1526 例程:暴风雪

l53 雾

1531 OpenGL的雾

1532 体积雾

l 54 镜像

1541 光照的镜像

1542 深度缓存的处理

1543 使用模板缓存来处理有限的平面

1544 对于非常规镜像表而的处理

1545 对任意指向的平面的处理

l55 阴影

1551 静态阴影

1552 投射阴影

1553 模板阴影体

1554 其他的方法

1555 例程:镜像与阴影

本章小结

第3篇 建立一个游戏

第16章 DirectX的使用:DirectInput

161 为什么要使用DirectInput

1611 Windows消息

1612 Win32

1613 Directlnput

162 DirectInput的初始化

163 DirectInput的使用

1631 设备的添加

1632 输入的获取

l633 关闭

164 动作映射

165 输入子系统的建立

l66 输入系统例程

本章小结

第17章 Directx Audio的使用

l71 声音的基础

l72 什么是DiteetX Audio

1721 DirecIX Audio的功能部件

l722 音频数据流

173 使用DirectMusic加载和演奏音频

1731 初始化COM

1732 创建与初始化演奏对象

1733 创建loader对象

1734 载入一个segment对象

1735 下载波段

1736 演奏segment

1737 停止一个segment的播放

1738 segment是甭止在播放

1739 segment循环的控制

17310 清理

l74 一个简单的例程

l75 Audiopath的使用

1751 默认的Audiopath

l752 标准Audiopath

1753 在Audiopath上播放声音

1754 从Audiopath获取对象

176 3D声音

l761 3D声音坐标

1762 感知

1763 DirectSound 3D缓存

1764 3D参数的设置

1765 DirectSound 3D听者

1766 3D音效文本例程

本章小结

第18章 3D模型的处理

181 3D模型文件格式

182 MD2文件格式

1821 MD2的实现

1822 MD2的载入

1823 MD2的显示

1824 添加纹理

1825 模型的动画

1826 开发一个CMD2Model类

1827 模型动画的控制

183 最后的一点小资料

本章小结

第19章 OpenGL物理建模

191 物理学的回顾

1911 时间

1912 距离、位移和位置

1913 速度

l914 加速度

1915 作用力

1916 动量

1917 摩擦力

192 真实世界的模拟

1921 任务的分解

1922 定时

1923 矢量

l924 平面

1925 物体

l926 物体碰撞的处理

1927 一个例程:空中曲棍球

本章小结

第20章 建立一个游戏引擎

201 SimpEngine的设计

2011 利用CNode管理数据

2012 对象的处胖:CObiect

202 引擎核

2021 输入系统

2022 CEngine类

2023 游戏循环

2024 输入的处理

2025 SimpEngine

203 视点

204 场景

205 模型的添加

206 音频系统

207 粒子系统

本章小结

第21章 创建一个游戏:杀戮时刻

2l1 初始设计

212 游戏场景

213 敌人

214 火箭与爆炸

215 用户的交互

216 运行游戏

217 建EXE可执行文件

本章小结

第4篇 附录

附录A 在线资源

A1 游戏开发

A2 OpenGL

A3 DirectX

A4 其他的资源

附录B 随书所附资料的使用

B1 用户界面

B2 文件结构

B3 系统要求

B4 安装

B5 其他相关问题与疑难解答信息

B6 是否仍旧需要帮助

语法也有错误:glVertex3fv(&vdata [&tindices[i][0][0]]);

glVertex3fv(&vdata [tindices[i][1][0]]);

glVertex3fv(&vdata [tindices[i][2][0]]);

改为:

glVertex3fv(vdata [tindices[i][0]]);

   

glVertex3fv(vdata [tindices[i][1]]);

     

glVertex3fv(vdata [tindices[i][2]]);

我的运行环境是在QT IDE上运行的。470版。

如果你是在VC上运行应该也要加入opengl32,glut,glut32库(32位WIN上的),

另外,这个程序你是看不到一个球体的,因为你没有使用光照,只能看到一个轮廓。

我的Qt上我加入的库是:opengl32,glut,glee5(glee5是glee是自己编译的替换glut32库)

头加入了:windownh,gl/gleeh(gleeh就是glee的头文件在网上可以下载,比glh要高级,因为WIN上的glh只支持到opengl32的11版)

源文件:

#include <windowsh>///////////////////////////////

#include <GL/gleeh>

////////////////////////////////

#include <GL\gluth>

#include <mathh>

#define x 52573

#define z 85965

void mydisplay(void)

{

 

static GLfloat vdata[12][3]={{-x,00,z},

{x,00,z},

                              {-x,00,-z},

                              {x,00,-z},

{00,z,x},

{00,z,-x},

                              {00,-z,x},

                              {00,-z,-x},

                              {z,x,00},

{-z,x,00},

                              {z,-x,00},

{-z,-x,00}};

 static GLuint tindices[20][3]={{1,4,0},

{4,9,0},

                                {4,5,9},

                                {8,5,4},

                                {1,8,4},

{1,10,8},

{10,3,8},

                                {8,3,5},

{3,2,5},

{3,7,2},

{3,10,7},

                                {10,6,7},

                                {6,11,7},

{6,0,11},

{6,1,0},

{10,1,6},

                                {11,0,9},

                                {2,11,9},

                                {5,2,9},

                                {11,2,7}};

 int i;

glBegin(GL_TRIANGLES);

 for(i=0;i<20;i++)

{

     

glVertex3fv(vdata [tindices[i][0]]);//////////////////////////////////////////////

     glVertex3fv(vdata [tindices[i][1]]);/////////////////////////////////////////////

     glVertex3fv(vdata [tindices[i][2]]);////////////////////////////////////////////

 }

glEnd();

}

int main(int argc, char argv[])

{

 glutInit(&argc, argv);

 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

 glutInitWindowPosition(100, 100);

 glutInitWindowSize(400, 400);

 glutCreateWindow("第一个OpenGL程序");

 glutDisplayFunc(&mydisplay);

 glutMainLoop();

 return 0;

}

后面加了///////////////////////////////////是我修改了的。

我用的连接库是:

LIBS=-lopengl32 -lfreeglut -lglee5

lokinegi@gmailcom

--------------------------------------

源代码我调通了,魔方程序可以正常运行~

楼主的编译器不知道是什么,我用的2005,即使你用60也无所谓,对于这个程序来所他们区别不大。如果你是2005那更好,我在邮件中会把工程打包给你,直接运行就好。

详细调试方法我会在邮件中告诉你。

------------------------------------------

opengl 这部分 需要在原有vc环境的基础上的扩充环境。 就是头文件,lib文件,dll文件。 3个部分可以当做补丁给vc打上。

关于这些文件我也会打包发给你,然后里面会有一个文档告诉你什么类型文件放在哪里。

通过API:wglCreateContext(DC)创建一个RC

设置当前的RC,通过API:wglMakeCurrent(RC, DC)来设置

实现释放或者选择其它RC:

调用API:wglMakeCurrent(NULL, NULL)使DC不再有RC。

调用API:wglMakeCurrent(AnotherRC, DC)选择其他RC为当前RC,一般情况下,我们都是一个RC对应一个DC,当然,在某些场合里面是可以有多个RC。

调用API:wglDeleteContent(RC) 直接删除,这个方法比较直截了当。

我有搞过类似的 不过易语言支持度不好

以上就是关于openGL 程序运行后窗口里面没东西,已经不止一次了。下面是代码,求解答。全部的内容,包括:openGL 程序运行后窗口里面没东西,已经不止一次了。下面是代码,求解答。、GPUImage源码解析 -- GLProgram、推荐一些学习OpenGL的资料等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9639753.html

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

发表评论

登录后才能评论

评论列表(0条)

保存