先来回答你的问题。
无法显示的原因,投影设置的视见体没有将你定义的矩形模型包括在内。
直观来讲,你可以将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的资料等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)