软件渲染:为什么我的顶点没有被转换?

  • 本文关键字:顶点 转换 软件 java
  • 更新时间 :
  • 英文 :


我目前正在处理一个基本的软件渲染项目,遇到了一个问题。我已经进行了一段时间的重构和清理,所以在呈现代码中有一些东西发生了变化。我现在遇到的问题是,即使我的顶点列表正在转换,但在渲染模型时,它根本没有转换。我想知道为什么会发生这种情况,因为我正在将对象(Vec3(传递给转换函数,并且它们正在这些函数中进行操作,为什么这些更改没有保留下来?

package PixelVision.Rendering;
import PixelVision.Math.*;
import java.util.ArrayList;
/*
* This class sits in an implementation of the Engine. This Object does
* everything from abstracting the rendering of meshes, to scaling the
* rendered coordinates to the screen size.
* 
* Full List:
* ~Scales Coordinates to ScreenSpace. (0, 0) is the center of the screen.
* ~Performs triangle clipping of triangles that go outside the screen.
* ~abstracts the rendering of meshes
*/
public final class SWRenderer {
private Bitmap target;
public ArrayList<Model> Models;
Mat4x4 projectionMat, viewMat;
Vec3 Camera, CameraDir, LightDir;
public SWRenderer() {
Models = new ArrayList<Model>();
}
public void SetRenderTarget(Bitmap tar) {
target = tar;
}
public void Init() {
projectionMat = Mat4x4.GetProjection(90f, 1f, 100f);
Camera = new Vec3();
LightDir = new Vec3(0, 0, -1f);
}
public void Render() {
for(Model m : Models) {
RenderModel(m);
}
}
private void RenderModel(Model model) {
Vec3[] vertices = model.getMesh().GetVertexData().clone();
Triangle[] tris = model.getMesh().GetTriangles().clone();
for(int v = 0; v < vertices.length; v++) {
WorldTransform(vertices[v], model);
ViewTransform(vertices[v]);
ProjectionTransform(vertices[v]);
}
for(Triangle tri : tris) {
Vec2 v1, v2, v3;
v1 = new Vec2(vertices[tri.Verts[0]].x, vertices[tri.Verts[0]].y);
v2 = new Vec2(vertices[tri.Verts[1]].x, vertices[tri.Verts[1]].y);
v3 = new Vec2(vertices[tri.Verts[2]].x, vertices[tri.Verts[2]].y);
ScaleVertexToScreen(v1);
ScaleVertexToScreen(v2);
ScaleVertexToScreen(v3);
RasterizeTriangle(v1, v2, v3);
}
}
private void WorldTransform(Vec3 vert, Model currentModel) {
vert = Mat4x4.Mul(Mat4x4.GetScale(currentModel.getScale()), vert); //Scaling
vert = Mat4x4.Mul(Mat4x4.GetTranslation(currentModel.getOrigin().GetNegative()), vert); //Rotation about models origin
vert = Mat4x4.Mul(Mat4x4.GetRotation(currentModel.getRotation()), vert);
vert = Mat4x4.Mul(Mat4x4.GetTranslation(currentModel.getOrigin()), vert);
vert = Mat4x4.Mul(Mat4x4.GetTranslation(currentModel.getLocation()), vert); //Translation
}
private void ViewTransform(Vec3 vert) {
//not yet implemented
}
private void ProjectionTransform(Vec3 vert) {
Mat4x4.Mul(projectionMat, vert);
}
private void ScaleVertexToScreen(Vec2 vert) {
vert.x += 1.0f;
vert.y += 1.0f;
vert.x *= 0.5f * (float)target.GetWidth();
vert.y *= 0.5f * (float)target.GetHeight();
}
private void RasterizeTriangle(Vec2 v1, Vec2 v2, Vec2 v3) {
Color c = new Color(Color.RED);
Draw.DrawLine(v1, v2, target, c);
Draw.DrawLine(v2, v3, target, c);
Draw.DrawLine(v3, v1, target, c);
}
}

您在WorldTransform函数中对vert的赋值只影响对本地vert变量的引用。这不会改变被引用对象,因此不会变换顶点。转换函数(如果需要赋值(应该返回新值。

vertices[v]=WorldTransform(vertices[v], model);
...
private Vec3 WorldTransform(Vec3 vert, Model currentModel){
//Apply transformations
return vert;
}

最新更新