[TinyRenderer] Readme Lesson 0 开始

2024-04-14 04:58
文章标签 readme lesson tinyrenderer

本文主要是介绍[TinyRenderer] Readme Lesson 0 开始,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • TL;DR
  • Readme
    • 1 编译
    • 2 主要想法
    • 3 其它: 一部分渲染器的例子

TL;DR

原文地址

Readme

Tiny Renderer 又名OpenGL是如何工作的:通过500行代码完成软件渲染。通过 the wiki来获取更加详细的内容

1 编译

git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
make &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj

mkdir --parents build && cd build && cmake .. && make && ./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj && convert framebuffer.tga framebuffer.png && open framebuffer.png && cd ..

渲染后的图片保存名为 framebuffer.tga.

你能通过Gitpod来运行项目,它是一个针对GitHub自由的在线开发环境。

打开后,编辑器将会编译和运行程序,同时将会在编辑器的预览中打开结果图片。只需要在编辑器中修改代码重新运行(使用历史的终端指令)来更新最新的成果图片

2 主要想法

我的源代码并不重要。阅读wiki文档并实现你自己的渲染器。只有当你经历过所有的小细节,你才会学习到它到底是怎样运行的。

在这个系列的文章,我将展示OpenGL的工作方式,通过手写一个它的克隆版本(一个尽可能简化的版本)。让我吃惊的是,我经常遇到一些不能克服初始障碍进入OpenGL/DirectX初学者阶段的开发人员。因此,我已经准备了一些列简短系列的开发文稿,通过这些学习,我的学生成为了很好的渲染器开发者。

因此,任务的形式如下:
不使用任何第三方相关的库(尤其是图形相关的),得到像下面这样的图片。

在这里插入图片描述

温馨提示:这个训练材料将会零碎的重复到OpenGL库的结构。它将成为一个软件渲染器。我不想去演示如何写基于OpenGL的应用程序。我想展示的是OpenGL是如何工作的。我坚信如果不理解工作原理,是无法使用3D库写出高效的应用。

我将尝试最终的代码量保持在500行左右。我的学生需要10到20个小时的编程时间来开始制作这样的一个渲染器。在输入处, 我们得到一个带有多边形线和纹理图片的测试文件 。在输出处,我们将得到一个渲染好的模型。没有图形界面,程序只是简单的得到一张图片。

因为这个目标是使用最小的外部依赖,我给我的学生仅仅在一节课中允许使用TGA文件。它是支持RGB/RGBA/黑和白的最简格式。因此,在开始的时候,我们将通过一个简单的方式来处理图片。你应该注意到,在一开始唯一可用的功能(除了加载和保存图像)是设置一个像素的颜色的功能。

没有绘制线段和三角形的函数。这些都得自己造轮子。 我提供我与学生并行编写的源代码。但我不建议使用它,因为这没有意义。整个代码可以在github上找到,这里你可以找到我给我的学生的源代码。

#include "tgaimage.h"
const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red   = TGAColor(255, 0,   0,   255);
int main(int argc, char** argv) {TGAImage image(100, 100, TGAImage::RGB);image.set(52, 41, red);image.flip_vertically(); // i want to have the origin at the left bottom corner of the imageimage.write_tga_file("output.tga");`return 0;
}

输出图片应该是下图这样(中间有一个红点):
在这里插入图片描述

3 其它: 一部分渲染器的例子

在这里插入图片描述

这篇关于[TinyRenderer] Readme Lesson 0 开始的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902122

相关文章

Lesson_for_java_day24--java中的GUI

一、GUI详解: GUI -- Graphical User InterfaceAWT (抽象窗口工具集 ) AbstractWindow Toolkit --为简单的applet程序设计 --AWT没有提供足够的桌面端的程序所需的特性--它不适宜用来构建丰富的桌面图形界面Swing--Swing是AWT的扩展和功能加强 --是构建java图形界面标准的APISWT(Standard

Lesson_for_java_day23--java的网络编程练习(登入界面、上传文档、上传图片、通过网络文本转换)

练习一、模拟账户登入界面 服务端: package Exercise;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.n

Lesson_for_java_day22--java的网络编程(IP、URL、UDP传输)

网络编程: 1、先找到对方的IP地址。 2、数据再发到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络 应用程序都用数字进行标识。为了方便称呼这个数字,就叫端口(逻辑端口) 3、定义通信规则。这个通信规则成为协议。国际组织定义了通用协议:TCP/IP。 网络总结: 1、TCP/IP协议既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台

Lesson_for_java_day21--java的多线程练习(ATM存取款机、多窗口卖票系统、5人赛跑)

一、ATM存取款机: package sonyi;//取款机存取钱练习:public class TestATM {public static void main(String[] args) {//开户Account1 a = new Account1(11111, 100);System.out.println(a);//存取钱new Thread(new ATMWindow(a, 1,

Lesson_for_java_day19--java的多线程(多线程概念、单例设计模式、死锁)

一、多线程 /*线程由两种实现方式:第一种方式:class MyThread extends Thread{public void run(){需要进行执行的代码,如循环。}}public class TestThread{public static void main(String[] args){Thread t1=new Mythread();T1.start();}}只有等到所有的

Lesson_for_java_day18--java中的IO流(序列化、ByteArrayStream、DataStream、RandowAccessFile)

一、序列化: package sonyi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java

Lesson_for_java_day17--java中的IO流(IO基本流、键盘输入、管道流、文件及文件夹操作、Properties类、切割文件、记录软件运行次数)

IO基本流: 字符流:读操作:Reader 字符输入流 抽象类Reader r = new FileReader(File f);构造方法:FileReader(File file) ;FileReader(String fileName) ;方法://读取一个字符并以整数的形式返回(0~255),//如果返回-1已到输入流的末尾。int read() throws IOException

Lesson_for_java_day16--java中的异常和IO流(File类、字节流、字符流、指定编码格式)

一、异常: --------------------------------java中的异常-------------------------------------------什么是异常:异常是中断了正常指令流的事件。异常的由来:出现问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象,其实就是java对不正常情况进行描述后的对象体现。异常的分类:(Th

Lesson_for_java_day15--java小练习:贪吃蛇游戏(在控制台上操作)

目的:编写一个贪吃蛇游戏,在控制台中操作。 思路: 1、贪吃蛇游戏中,需要蛇对象,食物对象和操作界面对象。 2、蛇对象中,包含蛇身对象(每个点),所以用容器存储蛇对象。 3、同理食物对象也需要容器存储。 4、操作界面由每个具体的点组成,所以需要一个生成点的类。 5、再将这些对象整合到一个控制游戏过程的对象中,实现游戏的过程。 代码: 生成操作界面的点类: package

Lesson_for_java_day14--java中的泛型、Comparator、Comparable

泛型: Demo1: package generic;import java.util.ArrayList;import java.util.Iterator;/*泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制。好处:1、将运行时期出现的问题classCastException,转移到编译时期,方便于程序员解决问题。让运行事情问题减少,安全。2、避免了强制