我在一个立方体中心放置一个点光源,如何让光透过立方体?

houdy 2003-09-14 04:03:42
就是这样的:我为立方体贴了图了,我想在里面放置一个点光源,让光可以透过立方体,就是实现立方体发光的效果!有那位高手知道怎么办?
...全文
166 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2003-09-23
  • 打赏
  • 举报
回复
半透明,贴图还有用的,可以模拟那种光晕效果
pzh508 2003-09-22
  • 打赏
  • 举报
回复
to hahu(网痞 -- 勿近)
要是设置透明了,那还要贴图的干吗?
pzh508 2003-09-22
  • 打赏
  • 举报
回复
to gofree2(天才狐狸)
有了贴图还能显示,无论怎么设置DIFFUSE也没有用啊
寻开心 2003-09-22
  • 打赏
  • 举报
回复
立方体材质设置emission参数,让它自发光,但是不照亮其他的景物。
光源在它的中心,但是光照向外,盒子的面也向外,所以光照对于盒子不起作用,必须用自发光模拟效果,再使用贴图模拟盒子各个面中心亮边界暗的效果就可以了。
gofree2 2003-09-21
  • 打赏
  • 举报
回复
晕~~为什么要这样做呢?修改DIFFUSE值不就行了?! 然后TEX和DIFFUSE MOD一下,就OK了

D3D固定渲染管道的计算灯光也是修改DIFFUSE. ;)
hahu 2003-09-19
  • 打赏
  • 举报
回复
里面的说道透明的部分内容
#include <windows.h> // // Windows的头文件
#include <stdio.h> // 标准输入输出库头文件
#include <gl\gl.h> // OpenGL32库的头文件
#include <gl\glu.h> // GLu32库的头文件
#include <gl\glaux.h> // GLaux库的头文件
HDC hDC=NULL; // 私有GDI设备描述表
HGLRC hRC=NULL; // 永久着色描述表
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例
bool keys[256]; // 用于键盘例程的数组
bool active=TRUE; // 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
bool light; // 光源的开/关 // Lighting ON/OFF
bool blend; // Blending OFF/ON? ( 新增 )
bool lp; // L键按下了么?
bool fp; // F 键按下了么?
bool bp; // B 键按下了么? ( 新增 )
GLfloat xrot; // X 旋转
GLfloat yrot; // Y 旋转
GLfloat xspeed; // X 旋转速度
GLfloat yspeed; // Y 旋转速度
GLfloat z=-5.0f; // 深入屏幕的距离
GLfloat LightAmbient[]= { 0.5f }; // 环境光参数
GLfloat LightDiffuse[]= { 1.0f }; // 漫射光参数
GLfloat LightPosition[]= { 0.0f }; // 光源位置
GLuint filter; // 滤波类型
GLuint texture[3]; // 3种纹理的储存空间
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc定义

然后往下移动到 LoadGLTextures() 这里。找到" if (TextureImage[0]=LoadBMP("Data/Crate.bmp")) "这一行。我们现在使用有色玻璃纹理来代替上一课中的木箱纹理。

if (TextureImage[0]=LoadBMP("Data/glass.bmp")); // 载入玻璃位图 ( 已修改 )

在InitGL()代码段加入以下两行。第一行以全亮度绘制此物体,并对其进行50%的alpha混合(半透明)。当混合选项打开时,此物体将会产生50%的透明效果。第二行设置所采用的混合类型。
Rui Martins 的补充: alpha通道的值为 0.0意味着物体材质是完全透明的。1.0 则意味着完全不透明。

glColor4f(1.0f,1.0f,1.0f,0.5f); // 全亮度, 50% Alpha 混合( 新增 )
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // 基于源象素alpha通道值的半透明混合函数 ( 新增 )
在接近第七课结尾处的地方找到下面的代码段。

if (keys[VK_LEFT]) //Left方向键按下了么?
{
yspeed-=0.01f; //若是, 减少yspeed
}
接着上面的代码,我们增加如下的代码。这几行监视B键是否按下。如果是的话,计算机检查混合选项是否已经打开。然后将其置为相反的状态。

if (keys['B'] && !bp) // B 健按下且bp为 FALSE么?
{
bp=TRUE; // 若是, bp 设为 TRUE
blend = !blend; // 切换混合选项的 TRUE / FALSE
if(blend) // 混合打开了么?
{
glEnable(GL_BLEND); // 打开混合
glDisable(GL_DEPTH_TEST); // 关闭深度测试
}
else // 否则
{
glDisable(GL_BLEND); // 关闭混合
glEnable(GL_DEPTH_TEST); // 打开深度测试
}
}
if (!keys['B']) // B 键松开了么?
{
bp=FALSE; // 若是, bp设为 FALSE
}

但是怎样才能在使用纹理贴图的时候指定混合时的颜色呢?很简单,在调整贴图模式时,文理贴图的每个象素点的颜色都是由alpha通道参数与当前地象素颜色相乘所得到的。比如,绘制的颜色是 (0.5, 0.6, 0.4),我们会把颜色相乘得到(0.5, 0.6, 0.4, 0.2) (alpha参数在没有指定时,缺省为零)。
就是如此!OpenGL实现Alpha混合的确很简单!

原文注 (11/13/99)
我(NeHe)混色代码进行了修改,以使显示的物体看起来更逼真。同时对源象素和目的象素使用alpha参数来混合,会导致物体的人造痕迹看起来很明显。 会使得物体的背面沿着侧面的地方显得更暗。基本上物体会看起来很怪异。我所用的混色方法也许不是最好的,但的确能够工作。启用光源之后,物体看起来很逼真。感谢Tom提供的原始代码,他采用的混色方法是正确的,但物体看起来并不象所期望的那样吸引人:)
代码所作的再次修改是因为在某些显卡上glDepthMask()函数存在寻址问题。这条命令在某些卡上启用或关闭深度缓冲测试时似乎不是很有效,所以我已经将启用或关闭深度缓冲测试的代码转成老式的glEnable和glDisable。

纹理贴图的Alpha混合
用于纹理贴图的alpha参数可以象颜色一样从问题贴图中读取。方法如下,您需要在载入所需的材质同时取得其的alpha参数。然后在调用glTexImage2D()时使用GL_RGBA的颜色格式

hahu 2003-09-19
  • 打赏
  • 举报
回复
加上了贴图也可以让它透明阿
呵呵,我上星期才开始接触opengl
看到的就是一个可以透明的贴图立方体
是nehe的教程
这里有下载
http://eett.nease.net/soft.html
nonocast 2003-09-19
  • 打赏
  • 举报
回复
BLEND
pzh508 2003-09-15
  • 打赏
  • 举报
回复
帮你UP吧
pzh508 2003-09-15
  • 打赏
  • 举报
回复
你要实现立方体发光,只要用放射光就可以实现,只是你加上贴图比较麻烦。
houdy 2003-09-14
  • 打赏
  • 举报
回复
这么长时间没人顶???
大家快告诉我呀。。

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧