LoginSignup
1
1

More than 5 years have passed since last update.

C89 でモダンなレイトレーシングを行う

Last updated at Posted at 2016-07-19

漢なら C89 でモダンな BVH を使ったレイトレしたいですね!

やりましょう!

できました.

これで IoT 機器でもレイトレーシングできますね!

なぜ C89 か.

昨今のコンパイラでは C99 は十分対応されているですが, C99 と C++03/C++11 が混在が難しかったり(long long の扱い, 不完全配列 a[], math.h など), IoT みたいな組み込み用途では C++ STL や libc/libm がまともに扱えなかったりとか, docker/runC でプロセスを isolate して実行したいのでプログラムを全部 static link したいような用途では, まだまだ C89 レベルで対応するような機会があるのではないか, と思いました.

C89 テクニック

    clang -fsanitize=address -o test -Weverything -g -O0 -ansi -pedantic test.c -lm

clang で -Weverything -ansi -pedantic あたりにしていろいろエラー/Warning を吐かせてチェックできるようにすると良いです. Address sanitizer 有効にするとなおよし!(-fsanitize=address)

変数定義が関数(ブロック)の最初でしかできない!

void func() {
    float a;
    a = 1.0f;
    float b = a + 2.0f;
}

とかすると, b が関数の最初に定義されていないと言われてエラーが出ます.

全部最初に持ってくるとコードが見づらい時はカッコ(ブロック)でくくるといいかも.

void func() {
    float a;
    a = 1.0f;
    {
       float b = a + 2.0f;
    }
}

long long(int64) の扱い.

C89 では stdint.h が使えないのですが... まあとりあえず昨今の 64bit OS では long long は 64bit と想定して良いのではないでしょうか.

bool 型が無い!

char or int で代用!

TODO

  • 三角形以外にも対応する.
  • カスタムメモリアロケータなどを提供して libc フリーにする.
  • Parallella などの MIMD プロセッサで動かす.
  • とあるアーキティクチャで動かす.
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1