java 顶点着色_Java软光栅渲染器-顶点光照

该博客详细介绍了如何在Java中使用Gouraud着色算法实现顶点着色,包括在Shader中设置Uniform变量、计算法向量变换矩阵、摄像机位置,以及在Shader类中定义光照计算。此外,还提供了一个测试用例以验证顶点光照效果,并修复了Box类法线数据的问题。
摘要由CSDN通过智能技术生成

目标

使用Gouraud着色算法实现顶点着色

3cf0f078758d2d7ddbd97619720773ee.png

实现

增加Uniform

进行顶点着色之前,需要先给Shader增加两个Uniform变量。其一是法向量变换矩阵,其二是摄像机在世界空间的坐标。

如果你不记得什么是“法向量变换”,可以回顾这篇文章 Java软光栅渲染器-空间变换 中的“法向量变换”部分。

在Renderer中添加一个法向量变换矩阵和一个摄像机位置,并在 render(ListgeomList, Camera camera) 方法中计算它们的值。

// 法向量变换矩阵

private Matrix3f normalMatrix = new Matrix3f();

// 摄像机位置

private Vector3f cameraPosition = new Vector3f();

/**

* 渲染场景

* @param scene

* @param camera

*/

public void render(List geomList, Camera camera) {

// 根据Camera初始化观察变换矩阵。

viewMatrix.set(camera.getViewMatrix());

projectionMatrix.set(camera.getProjectionMatrix());

viewProjectionMatrix.set(camera.getViewProjectionMatrix());

cameraPosition.set(camera.getLocation());

// TODO 剔除那些不可见的物体

// 遍历场景中的Mesh

for(int i=0; i

Geometry geom = geomList.get(i);

// 根据物体的世界变换,计算MVP等变换矩阵。

worldMatrix.set(geom.getWorldTransform().toTransformMatrix());

viewMatrix.mult(worldMatrix, worldViewMatrix);

viewProjectionMatrix.mult(worldMatrix, worldViewProjectionMatrix);

// 计算法向量变换矩阵

worldMatrix.toRotationMatrix(normalMatrix);

// FIXME 先判断是否为正交矩阵,然后在决定是否要计算Invert、Transpose矩阵。

normalMatrix.invertLocal();

normalMatrix.transposeLocal();

// TODO 使用包围体,剔除不可见物体

// 渲染

render(geom);

}

}

在Shader类中定义同样两个protected成员,并在Renderer中调用shader的set方法设置这些值。

/**

* 渲染单个物体

* @param geometry

*/

protected void render(Geometry geometry) {

// 设置材质

this.material = geometry.getMaterial();

// 设置渲染状态

this.raster.setRenderState(material.getRenderState());

//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值