主题:[原创]OpenGL入门学习——第十六课
eastcowboy
[专家分:25370] 发布于 2008-05-05 14:24:00
现在即将放出的是第十六课的内容。
首先还是以前课程的连接:
[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=185032]第四课,颜色的选择[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196017]第五课,三维的空间变换[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196231]第六课,动画的制作[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=218828]第七课,使用光照来表现立体感[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=219518]第八课,使用显示列表[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=224877]第九课,使用混合来实现半透明效果[/url]
[url=http://www.programfan.com/club/post-227694.html]第十课,BMP文件与像素操作[/url]
[url=http://www.programfan.com/club/post-244703.html]第十一课,纹理的使用入门[/url]
[url=http://bbs.pfan.cn/post-252901.html]第十二课,OpenGL片断测试[/url]
[url=http://bbs.pfan.cn/post-275218.html]第十三课,OpenGL是一个状态机[/url]
[url=http://bbs.pfan.cn/post-275219.html]第十四课,OpenGL版本和OpenGL扩展[/url]
[url=http://bbs.pfan.cn/post-275223.html]第十五课,从“绘制一个立方体”来看OpenGL的进化过程[/url]
第十六课,在Windows系统中显示文字 ——→ [color=0000FF]本次课程的内容[/color]
内容超多的一课!不过我想精彩的程度也一定不会让大家失望。大家不妨先浏览一下课程里的图片:)。
[color=FF0000]2008-06-10 修改了附件[/color]
增加了两个文件,showline.c, showtext.c。分别为第二个和第三个示例程序的main函数相关部分。
在ctbuf.h和textarea.h最开头部分增加了一句#include <stdlib.h>
附件中一共有三个示例程序:
第一个,飘动的“曹”字旗。代码为:flag.c, GLee.c, GLee.h
第二个,带缓冲的显示文字。代码为:showline.c, ctbuf.c, ctbuf.h, GLee.c, GLee.h
第三个,显示歌词。代码为:showtext.c, ctbuf.c, ctbuf.h, textarea.c, textarea.h, GLee.c, GLee.h
其中,GLee.h和GLee.c可以[url=http://www.opengl.org/sdk/libs/GLee/GLee5_21.zip]从网上下载[/url],因此这里并没有放到附件中。在编译的时候应该将这两个文件和其它代码文件一起编译。
=====================未完,请勿跟帖=====================
最后更新于:2008-06-10 15:57:00
回复列表 (共106个回复)
72 楼
李很太白 [专家分:0] 发布于 2010-04-13 11:12:00
再来顶一下
73 楼
李很太白 [专家分:0] 发布于 2010-04-15 14:01:00
lz您好,我又来发问了,先谢谢。
这次想请问lz有没有从帧缓存直接转换成纹理然后显示出来的例程呢?具体用到的应该是glCopyTexImage2D函数吧。本课的第二个例子中用到了这个函数,不过太复杂了看不太懂,于是想请问下有没有单纯点演示这个函数的例程呢?十分感谢!
74 楼
eastcowboy [专家分:25370] 发布于 2010-04-16 01:27:00
glCopyTexImage2D、glCopyTexSubImage2D都是可以的。这两个函数是把颜色缓存的数据拷贝到纹理中,但有一点区别:glCopyTexImage2D是重新制定纹理数据,以前的数据就作废了。而glCopyTexSubImage2D是修改纹理数据,没有修改的区域将会维持原样。
其实glCopyTexImage2D就相当于是先glReadPixels再glTexImage2D。只不过数据复制的路线更短,速度更快,而且不用我们去分配内存作为临时空间。而glCopyTexSubImage2D就相当于是先glReadPixels再glTexSubImage2D。
写了一个简单的程序:
[code=c]#include <GL/glut.h>
#include <stdio.h>
void display()
{
// 第一步,绘制一些东西。这里绘制一个四边形
glDisable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(-1.0f, -1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(1.0f, -1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(1.0f, 1.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex2f(-1.0f, 1.0f);
glEnd();
// 第二步,把绘制好的像素拷贝到纹理中
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 512, 512);
// 第三步,使用纹理再绘制别的东西
glEnable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(0.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 1.0f);
glEnd();
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("OpenGL Texture Sample");
glutDisplayFunc(&display);
// 先用glTexImage2D创建一个纹理。这样以后就可以使用glCopyTexSubImage2D了
// 如果这里不这样做,那以后就需要用glCopyTexImage2D。
// 注意glCopyTexSubImage2D的效率更高
// 最后一个参数为NULL,表示现在并不指定像素。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512,512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
// 设置纹理参数。这里设置了就不必每次在display函数中设置
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glutMainLoop();
return 0;
}[/code]
75 楼
李很太白 [专家分:0] 发布于 2010-04-16 13:29:00
先学学,先谢谢!
76 楼
李很太白 [专家分:0] 发布于 2010-04-17 13:21:00
eastcowboy,您好。看您以前纹理的教程中创建纹理都是要用到glEnable(GL_TEXTURE_2D) 、 glGenTextures 和 glBindTexture 函数的。而这里您只是用glTexImage2D就可以直接创建纹理了,请问有什么区别吗?
谢谢您!
77 楼
eastcowboy [专家分:25370] 发布于 2010-04-17 19:50:00
呵呵,测试可以像我那样写。
如果您觉得可以确保整个程序只会用到一个纹理的话,就可以不必使用glGenTextures和glBindTexture,否则的话就需要了。
78 楼
李很太白 [专家分:0] 发布于 2010-04-18 17:59:00
好的,谢谢
79 楼
李很太白 [专家分:0] 发布于 2010-04-20 15:11:00
最近没有什么问题 过来顶顶 ^_^
80 楼
TFLSguoyu [专家分:0] 发布于 2010-08-06 09:47:00
谢谢楼主,竟然有这么好的东西。
我来回复