← Back to list

Lunora’da Texture Renderlama

Grafik motorları texture'ları nasıl renderlar?

Tuana Nohut · 2025-12-19 17:07 · 0 claps · 3.3 min read
#graphics-programming #rendering-engine #programming #directx-11 #low-level-programming
Open on Medium ↗
Wiki topics: 💻 · Programming

Lunora’da Texture Renderlama

Herkese merhaba, ben Tuana.

Bu yazıda Lunora’da texture renderlama sürecimden bahsetmek istiyorum. Grafik motorlarının meshlere, yani modellere, texture’ı nasıl giydirdiğini merak ediyorsanız, bu yazı size fikir verebilir. Zaten hemen hemen her grafik motorunda bu süreç benzer şekilde işliyor.

Lunora Nedir?

Lunora, DirectX11 ve C++ kullanarak sıfırdan geliştirdiğim bir grafik motoru. Kendi grafik programlama becerilerimi geliştirmek ve okuduğum çeşitli grafik makalelerini birebir uygulayabilmek için bu projeye başlamaya karar verdim. Başladığımda oldukça acemiydim; bir şeyler öğrendikçe motoru baştan yazmak zorunda kaldım. Yanılmıyorsam bunu 3 defa yaptım ama kesinlikle değdi. Çok şey öğrendim ve hâlâ öğreniyorum.

Texture Yüklemek

Şimdi LinkedIn’de paylaştığım görselleri nasıl elde ettiğimi adım adım anlatacağım.

Aslında üçgen üzerinde çalışırken herhangi bir sorun yaşamamıştım. Texture da, model de gayet düzgün şekilde görünüyordu. Fakat iş küpe gelince şöyle bir görüntüyle karşılaştım:

Texture yükleniyordu ama renkler kayıyordu. Küpün her yüzünde farklı bir şekilde görünüyordu ve sorunun ne olduğuna dair en ufak bir fikrim yoktu.

İlk aşamada yüklemeye çalıştığım veri; vertex, color, texture ve index verilerini içeriyordu. Parser tarafında dosyayı okurken hata yapmış olamazdım; çünkü texture yükleniyordu hatırlarsanız, üçgen renderlarken herhangi sorun yaşamıyordum. Yine de şüphelenip color verisini tamamen silmeye karar verdim.

Bu noktada iki farklı veri yapısı elde ettim:

  • Birinde vertex, color, index vardı,
  • Diğerinde de vertex, texture coordinate, index vardı.

Parser’ı da buna göre düzenledim. Dosya okuma tarafında bir sorun yoktu. Color verisini sildiğim dosyayı renderlayınca aşağıdaki görüntüyü elde ettim:

Sorunun hâlâ parser’dan kaynaklandığını düşünüyordum. Texture yükleme kodunda da bir problem yoktu. Bir süre sonra sorunun shader’a veri gönderme tarafında olabileceğini fark ettim.

Sorunun Kaynağı: Input Layout

DirectX11’de CPU’dan GPU’ya veri gönderirken, yani shader’ın kullanacağı veriyi tanımlarken bir struct oluşturmanız gerekiyor. Ben de tek bir Vertex struct’ı olsun, hem color hem de texture verisini içersin, hangisi gerekiyorsa onu kullanırım diye düşündüm.

Benim Vertex tanımım şu şekildeydi:

struct Vertex
{
  XMFLOAT3 position;
  XMFLOAT4 color;  
  XMFLOAT2 texture;
};

Dosyadan okuduğum verileri tutmak için de şu Mesh yapısını kullandım:

struct Mesh
{  
  ID3D11Buffer *vertexBuffer = nullptr;
  ID3D11Buffer *indexBuffer = nullptr;
  UINT vertexCount = 0;
  UINT indexCount = 0;
  UINT stride = sizeof(Vertex);
  UINT offset = 0;
  Vertex* vertices;
  unsigned long* indices;
  char *filename;
};

Buraya kadar her şey doğru gibiydi.

Sonra hem color shader hem de texture shader için yazdığım D3D11_INPUT_ELEMENT_DESC tanımlarına baktım. Burada önemli olan şey, shader tarafında yazdıklarınızla birebir uyumlu olması. Yani GPU’ya “ne gönderiyorum ve bunu hafızanın neresinden okuyacaksın” demiş oluyorsunuz.

Color shader için tanımım şöyleydi:

  D3D11_INPUT_ELEMENT_DESC input_layout[] =
    {
      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
      { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };
Texture shader için ise:
  D3D11_INPUT_ELEMENT_DESC input_layout[] =
    {
      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
      { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };

İlk bakışta bir sorun yok gibi duruyor, değil mi? Zaten color shader tarafında hiç problem yaşamamıştım. Ama texture neden bozuk geliyordu? Burada gözüme çarpan şey D3D11_APPEND_ALIGNED_ELEMENT oldu.

Hata Nerede?

D3D11_APPEND_ALIGNED_ELEMENT, AlignedByteOffset yerine yazılıyor ve yaptığı şey şu: Kendinden önceki verinin boyutunu hesaplayıp bir sonraki verinin hafızadaki yerini otomatik belirliyor.

Şimdi Vertex yapısını tekrar hatırlayalım. İşimizi kolaylaştırmak adına şu şekilde görselleştirdim:

  • XMFLOAT3 position → 3 * 4 = 12 byte
  • XMFLOAT4 color → 4 * 4 = 16 byte
  • XMFLOAT2 texture → 2 * 4 = 8 byte

Toplamda Vertex 36 byte yer kaplıyor.

Texture shader’da D3D11_APPEND_ALIGNED_ELEMENT kullandığımda, GPU position’dan sonra gelen color verisini okumaya çalıştı. Yani texture coordinate yerine color’ın R ve G değerlerini kullandı. Bu yüzden o garip görüntü oluştu.

Çözüm basitti: Texture verisini okumadan önce color’ı atlamam gerekiyordu. Yani offset’i 12 + 16 = 28 olarak vermeliydim.

Bunu yaptıktan sonra aşağıdaki doğru görüntüyü elde ettim:

Sonrasında aynı anda:

  • 32-bit TGA
  • 24-bit TGA
  • Color verisi

renderlayan aşağıdaki sahneyi elde ettim.

https://youtu.be/Wes7byYdf4w

Şimdilik Lunora’da texture yükleme bu şekilde çalışıyor. Umarım ufak da olsa texture renderlama konusunda bir fikir vermiştir. Yazıyı okuduğunuz için teşekkür ederim.

Bana ulaşmak isterseniz veya diğer çalışmalarımı görmek isterseniz web siteme göz atabilirsiniz. Sorunuz olursa çekinmeyin,

Kendinize iyi bakın.

https://tuananohut.github.io/


메타데이터
post_id
508b2d5603bb
slug
lunorada-texture-renderlama-508b2d5603bb
url
https://medium.com/@tkane_n/lunorada-texture-renderlama-508b2d5603bb
canonical_url
https://medium.com/@tkane_n/lunorada-texture-renderlama-508b2d5603bb
author_url
https://medium.com/@tkane_n
status
ok
fetched_at
2026-08-01 17:22:33