C/C++ C/c++ ile 3D renderer nasıl yapılır?

Katılım
26 Ocak 2020
Mesajlar
6.341
Makaleler
1
Çözümler
13
Yer
İstanbul
Bir projeyi bitirdim ve yenisine baslamak istiyorum. Acelem yok aylarca da sürebilir. Yavas yavas ilerleyip cok şey ogrenecegim bir şey olmasini istiyorum ve aklima bu geldi. Hedefim basit bir 3D renderer yapmak. Örneğin draw_cube() diye bir fonksiyon çağırıp uygulamayi çalıştırinca dondurup ışıklara bakabilecegimiz bir küp olacak ekranda gibi.

Mumkun oldugunda kutuphane kullanmak istemiyorum amacim öğrenmek çünkü. Doğrusal cebir bilgim gayet yeterli diye düşünüyorum.

Sizce C mi C++ mı daha doğru olur bunun için? Ikisini de kullandim bayağı fakat C ile daha deneyimliyim.

Ve önerebileceğiniz kaynak var mı acaba? Video serisi olur, kitap olur, blog olur fark etmez.

Iyi akşamlar herkese.
 
Son düzenleyen: Moderatör:
Hocam selamlar. Bu tarz temelden bir renderer projesi için C gayet de yeterli olur, hatta daha iyi bile olabilir. Neden dersen, C++'ın OOP gibi özellikleri başlangıçta işleri biraz karıştırabilir. Amacın gerçekten en temele inmek, bellek yönetimini, veri yapılarını iliklerine kadar hissetmekse C sana bu konuda çok daha temiz bir deneyim sunar. C++ elbette daha büyük projelerde avantajlı ama senin "mümkün olduğunca kütüphane kullanmadan öğrenmek" hedefinle C'nin sadeliği daha çok örtüşüyor gibi.
 
Bende oyle düşündüm. C ile yazdigim şeyler cok amaca ozel olduğundan optimize etmesi ve yazmasi daha guzel oluyor.
 
Sahsen C++'i tercih ederim. Templateler ile ayni fonksiyonun; int, float, double... versiyonlarini yazmaktan kacinmis olursun. Memory management, C'den elli kere daha rahat ve saglikli. OOP kullanmak zorunda da degilsin. C gibi kullanabilirsin C++'i. C++ zorlastirmaz bunu yapmani. Bellek yonetiminde de derine inmek icin illa malloc(), realloc() ve free() uclusunu kullanmak zorunda degilsin. new referansini okudugunda malloc'un otomatik hali oldugunu goreceksin zaten;
C++:
// no inline, required by [replacement.functions]/3
void* operator new(std::size_t sz)
{
    std::printf("1) new(size_t), size = %zu\n", sz);
    if (sz == 0)
        ++sz; // avoid std::malloc(0) which may return nullptr on success
 
    if (void *ptr = std::malloc(sz))
        return ptr;
 
    throw std::bad_alloc{}; // required by [new.delete.single]/3
}

new int dediginde otomatik olarak; malloc(sizeof(int)) uygulamis oluyor ama daha type safe bir sekilde, ve type icin gerekli bir baslatma parametren varsa, onlarida constructor'a koydugunda, default new constructeri'da cagirir.



Eger bunu smart pointerlarla kullanirsan elle delete yapmana gerek kalmaz;

Bu pointera referans gosteren bir degisken kalmadikca, bu asla yok olmayacak. Dogru kullanirsan, (shared_ptr'in raw pointerini alip sonra sagda solda kullanmaya calismazsan), asiri guvenli raw pointer'a gore. Yada unique_ptr kullanirsin bu degiskenin sadece ayni anda tek sahibi olur (rust mantigi). shared_ptr thread safe degildir, unique_ptr thread safetir cunku zaten ayni anda tek sahibi olur. Dikkat etmen gereken sey, pointerin referansinin gercekten sadece unique_ptr tarafindan kullanilmasi olur bu noktada.

C++ biraz daha genis ve cetrefilli bir dil olarak gelebilir belki ama ben tercihimi C++'tan yana kullanirdim, kullandim da.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…