|
|
我今年3月才接触的OpenGL(之前没有接触过计算机图形方面的东西), 一个月前才知道GPU也能编程和有shadinglanguage. 本来想暂时用不上,以后再学(目前OpenGL的基本功能都没有精通呢),结果没想到这么快就被逼得必须要用了. 由于基础太差(计算机图形学, 数学, 英语很差, GPU的硬件结构, 管线都不了解),所以看了两天<<OpenGL Shading Language>>还是不太清楚,但又急着用,所以希望大家不吝赐教,并且尽可能通俗一些,呵呵.
如果大家谁有关于GPU硬件原理, 工作原理的资料( 如:一般有哪些寄存器, 名字叫什么, 掌管什么功能等等), 还望可以给我一份, 或者直接解答.
我需要制作一个比较仿真的海面, 使用傅立叶变换 + P-M频谱 + 视点相关LOD来生成可以振动的海面网格, 目前这个工作已经完成了, 但是最后的给海水赋予颜色(或纹理)的工作却遇到了麻烦, 如果海水是单一的颜色,那么就看不出有振动的效果, 所以必须使海水有明暗变化和反射效果, 由于组成海面的网格较大(比一个像素大多了),所以如果使用传统的OpenGL功能渲染,就会出现颜色一块一块的现象(使用了GL_SMOOTH也不行), 在网上看别人都是使用GPU编程来逐像素渲染颜色的, 效果很不错, 所以也想使用, 但目前存在以下不明白的地方:
1:网上查的时候有人使用CubeTex和Normal map(使用Direct 3D作的), 这是什么东西?
CubeBox我没听过; Normal Map 是不是 像Bump map 和Phong shding (以前看过相关理论的文章)中使用的那种里面储存着向量的纹理? 可是这些数据是怎么写到图片里去的? Direct中有.DDS格式来存储这种图, OpenGL里面怎么办?
2:具体的渲染流程应该怎么组织呢? 我现在的设想是:
(1). 使用VP(或VS)计算每个网格顶点的法线(这个工作如果让CPU作的话, 法线的标准化将会是一个很大的工作量).
但是求法线需要知道这个顶点所在的平面上的两条过这个顶点的向量, 这两条向量一般是用当前顶点相邻的两个顶点减去当前顶点得到的, 我看书上VP(或VS)中可以知道当前点的坐标, 但是怎么才能知道另外两个点的坐标呢? 莫非是通过Uniform每一帧都传依次参数?
(2). 通过视点到网格上每个顶点的的入射"光"线 和上一步求出的法线, 求出出射"光"线. 再求出出射"光"线与海面上方某个平面的交点(这个虚拟的平面就相当于天空的纹理), 求出该纹理这一点的颜色, 与网格顶点的原有颜色融合.
但是在VP(或VS)中似乎不能处理纹理, 那怎么求得纹理某点的颜色呢?
(3). 在FP(或PS)中进行逐像素上色时,每个像素的颜色使用该像素所在三角面的三个顶点的颜色值进行插值.
但是这个也存在着(1)中的问题, 怎么获取这3个顶点的颜色值呢? 不会也用Uniform参数传吧.
综上所述, 我觉的自己的设想应该是错误的,可能不符合GPU编程提供的功能和图形渲染的机制. 可能只能使用什么CubeTex 和 Normal Map了, 但又不会, 不知各位大虾有没有什么好的方法并教教我.
|
|