BumpTexture

1. 新建一个OpenGL 空effect;

2. 添加相关变量

右击Effect节点选择Add Variable->float->float / float3 添加镜面光强度、灯光位置和相机位置参数:

float fSpecularPower = 25.0;

float3 vec3LightPosition = {-100.0,100.0,100.0};

float3 vec3EyePosition = {0,0,100.0};

右击Effect节点选择AddTexture->Add 2DTexture 添加base和bump两张纹理图片:

Fieldstone.tga   ---->  base

FieldstoneBumpDOT3.tga  -----> bump

右击Effect节点选择Add Variable->Color 添加 环境光、散射光、镜面光颜色

fvAmbient  = {0.3,0.3, 0.3};

fvDiffuse = {0.86,0.86,0.86};

fvSpecular = {0.57,0.56,0.58};

3. 修改Stream Mapping 中 添加NORMAL、TexCoord 、 BINORMAL、TANGENT

4. 在pass0中添加纹理对象 AddTextureObject 将base和bump图片添加进去,重新命名为baseMap和bumpMap

5. 修改vertex shader :

uniform vec3 vec3LightPosition;
uniform vec3 vec3EyePosition;

varying vec2 texcoord;
varying vec3 viewDirection;
varying vec3 lightDirection;

attribute vec3 rm_BiNormal;
attribute vec3 rm_Tangent;

void main(void)
{
   gl_Position = ftransform();
   
   texcoord = gl_MultiTexCoord0.xy;
   vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
   
   vec3 fviewDirection = normalize(vec3EyePosition - fvObjectPosition.xyz);
   vec3 flightDirection = normalize(vec3LightPosition - fvObjectPosition.xyz);
   
   vec3 fvNormal = gl_NormalMatrix * gl_Normal;
   vec3 fvBiNormal = gl_NormalMatrix * rm_BiNormal;
   vec3 fvTangent = gl_NormalMatrix * rm_Tangent;
   
   viewDirection.x = dot(fvTangent, fviewDirection);
   viewDirection.y = dot(fvBiNormal, fviewDirection);
   viewDirection.z = dot(fvNormal, fviewDirection);
   
   lightDirection.x = dot(fvTangent, flightDirection);
   lightDirection.y = dot(fvBiNormal, flightDirection);
   lightDirection.z = dot(fvNormal, flightDirection);   
}

6.修改pixel shader:

uniform vec4 fvAmbient;
uniform vec4 fvSpecular;
uniform vec4 fvDiffuse;
uniform float fSpecularPower;

uniform sampler2D baseMap;
uniform sampler2D bumpMap;

varying vec2 Texcoord;
varying vec3 ViewDirection;
varying vec3 LightDirection;

void main( void )
{
   vec3  fvLightDirection = normalize( LightDirection );
   vec3  fvNormal         = normalize( ( texture2D( bumpMap, Texcoord ).xyz * 2.0 ) - 1.0 );
   float fNDotL           = dot( fvNormal, fvLightDirection );
   
   vec3  fvReflection     = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection );
   vec3  fvViewDirection  = normalize( ViewDirection );
   float fRDotV           = max( 0.0, dot( fvReflection, fvViewDirection ) );
   
   vec4  fvBaseColor      = texture2D( baseMap, Texcoord );
   
   vec4  fvTotalAmbient   = fvAmbient * fvBaseColor;
   vec4  fvTotalDiffuse   = fvDiffuse * fNDotL * fvBaseColor;
   vec4  fvTotalSpecular  = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
 
   gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular );      
}

7. 效果图

RenderMonkey 练习 第四天 【OpenGL Texture Bump】的更多相关文章

  1. 初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞

    这篇相当于是对前三篇的总结,基本效果如下: 在初试PyOpenGL一 (Python+OpenGL)讲解Pyopengl环境搭建,网格,球体,第一与第三人称摄像机的实现.在初试PyOpenGL二 (P ...

  2. RenderMonkey 练习 第一天 【opengl 纹理】

    础实例: 我们首先实现一个带纹理模型的显示,大体了解RenderMonkey的操作方式. 1. 打开RenderMonkey, 右击WorkSpace的Effect WorkSpace结点,选择Add ...

  3. 把Android原生的View渲染到OpenGL Texture

    http://blog.csdn.net/u010949962/article/details/41865777 最近要把Android 原生的View渲染到OpenGL GLSurfaceView中 ...

  4. Android OpenGL ES 开发(四): OpenGL ES 绘制形状

    在上文中,我们使用OpenGL定义了能够被绘制出来的形状了,现在我们想绘制出来它们.使用OpenGLES 2.0来绘制形状会比你想象的需要更多的代码.因为OpenGL的API提供了大量的对渲染管线的控 ...

  5. RenderMonkey 练习 第二天 【opengl 光照模型】

    光照模型 3D渲染中, 物体表面的光照计算公式为: I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular); 其中,环境光(ambient)计算公式为 ...

  6. 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)

    本文记录OpenGL播放视频的技术.上一篇文章中,介绍了一种简单的使用OpenGL显示视频的方式.但是那还不是OpenGL显示视频技术的精髓.和Direct3D一样,OpenGL更好的显示视频的方式也 ...

  7. OpenGL ES 光照模型之——环境光照(RenderMonkey测试)

    概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...

  8. OpenGL ES学习笔记(三)——纹理

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...

  9. C#+OpenGL编程之再见小桃子(The Tao Framework)

    本文基础: C#+OpenGL编程之OpenGL 纹理载入 C#+OpenGL编程之OpenGL 多重纹理 小桃子The Tao FrameworkTao提供的所有库都是完全开源的.其中的多数库都可以 ...

随机推荐

  1. HDU - 2818

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. 《java并发编程实战》读书笔记6--取消与关闭

    第7章 取消与关闭 这章的主要内容是关于如何使任务和线程安全,快速,可靠的停止下来. 7.1 任务取消 在Java中没有一种安全的抢占方式来停止线程,但是可以使用一些协作机制,比如: 让素数生成器运行 ...

  3. LeetCode Binary Tree PostorderTranversal

    Problem Description Given a binary tree, return the postorder traversal of its nodes' values. For ex ...

  4. 深度理解onmouseover事件和onmouseout事件

    今天简单的讲解下onmouseover事件和onmouseout事件,一直以为它们只是简单的分别实现鼠标指针移动到元素上时触发事件和在鼠标指针移出指定的对象时触发事件,但是突然发现这些只是对它们简单的 ...

  5. HDMI 电视 点对点 桌面超出屏幕

    一直在用电视作显示器,但是没有注意点对点到问题,只是感觉字体发虚.直到今天装win10,桌面会超出屏幕,使用intel控制面板调整分辨率后正常,但是注销或重启会再次回复.百度无果,自己摸索,不仅解决了 ...

  6. taskeng.exe禁用

    打开控制面板. 打开管理工具. 打开任务计划程序. 双击左边的的任务计划程序库,看到MySQL,然后双击MysQL,接着看到Installer,再双击Installer,这时候想禁止可以直接禁止 右击 ...

  7. 下载Maven安装包

    进入Maven官网的下载页面:http://maven.apache.org/download.cgi,如下图所示: 选择当前最新版本:"apache-maven-3.3.9-bin.zip ...

  8. sql 触发器 游标

    在数据库中,删除一条记录的同时想要删除另一个表里的数据,这时我们可以选择使用触发器.触发器主要是通过事件进行触发被自动调用执行的,而存储过程可以通过存储过程的名称被调用.触发器是当对某一个表进行操作. ...

  9. php在web服务器中的工作原理

    1.web工作原理 我是学习PHP网站建设的,那么网站在客户端和服务端的运行是网站运行的根本所在,那个这个运行过程是怎样的呢?我们一探就将! Web:终端 服务器web:我们把提供(响应)服务的计算机 ...

  10. gwy常识

    其实公务员考试是一门艺术,七分靠水平,三分凭发挥,充分而又细致的准备则是取得优秀成绩的前提.考生若想在笔试中成功上岸,还需苦练内功,凭技巧和真才实学在考场上一较高下.那么针对历年上海公务员考试笔试考情 ...