{"id":3135,"date":"2026-07-03T16:56:28","date_gmt":"2026-07-03T16:56:28","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=3135"},"modified":"2026-07-03T16:56:28","modified_gmt":"2026-07-03T16:56:28","slug":"sdl-painter-proje-altyapisi-faz-0","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/","title":{"rendered":"sdl-painter &#8211; Proje Altyap\u0131s\u0131 (faz-0)"},"content":{"rendered":"<p>C++ kullanarak 2B uygulama geli\u015ftirme i\u00e7in biricik yard\u0131mc\u0131n\u0131z olacak olan sdl-painter maceram\u0131za devam ediyoruz. Okumayanlar i\u00e7in ilk yaz\u0131m\u0131n ba\u011flant\u0131s\u0131n\u0131 a\u015fa\u011f\u0131ya koyuyorum. Bir g\u00f6z atman\u0131zda fayda var.<\/p>\n<p><strong><a href=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\">[Duyuru] sdl-painter<\/a><\/strong><\/p>\n<p>\u00d6zetle, sdl-painter, SDL3 + OpenGL 3.3 Core ve Vulkan 1.1 ile modern C++ kullan\u0131larak , \u00e7oklu platform deste\u011fi sunan, sa\u011flam ve g\u00fcncel bir yaz\u0131l\u0131m altyap\u0131s\u0131 ve ara\u00e7lar\u0131 ile geli\u015ftirilen 2B \u00e7izim k\u00fct\u00fcphanesidir.<\/p>\n<p>Yaz\u0131lar\u0131m\u0131 ve sdlpainter i\u00e7erisindeki \u00f6rneklerimi fazlara b\u00f6ld\u00fcm. Yaz\u0131 ve kod i\u00e7erisinde bunlara \u00e7ok rast gelebilirsiniz. Neden &#8220;faz&#8221;lara b\u00f6ld\u00fc\u011f\u00fcm\u00fc de s\u00f6yleyeyim: a\u00e7\u0131k\u00e7as\u0131, k\u00fct\u00fcphaneyi tek hamlede anlatmak yerine, her yaz\u0131da \u00e7al\u0131\u015fan, elle tutulur bir par\u00e7a ekleyerek ilerlemeyi tercih ettim. Her faz bir \u00f6ncekinin \u00fcst\u00fcne biniyor olacak<\/p>\n<p>Geri d\u00f6necek olursak, bir \u00f6nceki yaz\u0131mda, \u00e7izimlere y\u00f6nelik \u00e7ok detaya girmemi\u015ftik. Bu yaz\u0131mda da pek giremeyece\u011fiz ne yaz\u0131k ki \ud83d\ude42 Neden peki? \u00d6ncelikle temelimizi biraz daha g\u00fc\u00e7lendirmemizde fayda var, bunun i\u00e7in de bu yaz\u0131m\u0131 da bu konuya ay\u0131raca\u011f\u0131m. Bununla birlikte bir sonraki yaz\u0131mda, art\u0131k can cana giri\u015f yap\u0131yoruz.<\/p>\n<p>Bu arada \u015funu da s\u00f6ylememe izin verin l\u00fctfen, sdl-painter&#8217;\u0131 ba\u015fka i\u015flerimde de aktif olarak kullananmaya devam ediyorum. Bu yaz\u0131lar\u0131n gecikmesinin sebebi de biraz o i\u015fler oluyor ama kullan\u0131m s\u0131ras\u0131nda da bir \u00e7ok iyile\u015ftirme veye eklenebilecek yeni kabilyetlerin de fark\u0131n avar\u0131yorum. Onun i\u00e7in asl\u0131nda k\u00fct\u00fcphanenin palazlanmas\u0131 ve biraz h\u0131rpalanmas\u0131nda fayda var. Bu kullan\u0131mlar o a\u00e7\u0131dan iyi oluyor.<\/p>\n<p>Peki bu yaz\u0131m\u0131n kapsma\u0131 nedir? Hemen s\u0131ralayay\u0131m, bu yaz\u0131da mimariyi, kullan\u0131lan temel tipleri, yaz\u0131l\u0131m olu\u015fturma (build) sistemini, OpenGL&#8217;I ve tabi ki CI\/CD alt yap\u0131s\u0131n\u0131 ele alaca\u011f\u0131z. Bu arada, burada bahsi ge\u00e7en altyap\u0131sal bir \u00e7ok mekanizmay\u0131 kendi projelerinizde de kullanabilirsiniz.<\/p>\n<p>O zaman ilk ba\u015fl\u0131k ile ba\u015flayal\u0131m.<\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Proje Mimarisi<\/strong><\/span><\/h3>\n<p>Bir \u00f6nceki yaz\u0131mda da bahsetti\u011fim gibi, sdlpainter, katmanl\u0131 bir yap\u0131ya sahip ve her katman\u0131n ayr\u0131 sorumluluklar\u0131 bulunmakta:<\/p>\n<pre class=\"lang:c++ decode:true \">SDLPainter\r\n    \u2192 Transform Stack \/ State\r\n        \u2192 Shape Tessellator\r\n            \u2192 IRenderer\r\n                \u2192 OpenGLRenderer | VulkanRenderer\r\n                    \u2192 SDL3 Platform Layer<\/pre>\n<p>&nbsp;<\/p>\n<p>Katmanlar\u0131 teker teker inceleyelim:<\/p>\n<ul>\n<li><span style=\"text-decoration: underline;\"><strong>Painter (Public API):<\/strong> <\/span>Geli\u015ftiricinin g\u00f6rd\u00fc\u011f\u00fc katman. DrawCircle, FillRect, SetPen gibi \u00e7a\u011fr\u0131lar bu katman \u00fczerinden yap\u0131l\u0131yor. Pen, Brush, transform stack burada bulunuyor. \u00c7o\u011fu zaman k\u00fct\u00fcphaneye y\u00f6nelik kullanaca\u011f\u0131n\u0131z k\u0131s\u0131m buras\u0131 olacak. Buray\u0131 olabildi\u011fince sade tutmak amac\u0131m,<\/li>\n<li><span style=\"text-decoration: underline;\"><strong>Shape Tessellator:\u00a0<\/strong><\/span>\u015eekilleri (daire, dikd\u00f6rtgen, poligon) backend&#8217;in (burada opengl ve vulkan oluyor) anlayaca\u011f\u0131 vertex listelerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcyor. Bu katman ile gelen \u00fcst seviye \u00e7izim isteklerini al\u0131p, bunlar\u0131 bir seviye ayr\u0131\u015ft\u0131r\u0131p \u015fekil koordinatlar\u0131na \u00e7eviriyoruz. Bunu yaparken de kullan\u0131lacak g\u00f6rselle\u015ftirme backendinden bunu ba\u011f\u0131ms\u0131z yap\u0131yoruz. Bir di\u011fer ifade ile \u015fu an i\u00e7in OpenGL ve Vulkan ama ileride DirectX olsa da bunu orada kullanabilecektik. Bu a\u00e7\u0131dan \u00f6nemli bir katman,<\/li>\n<li><strong><span style=\"text-decoration: underline;\">IRenderer<\/span>:<\/strong> \u015eimdi geldik as\u0131l aksiyonun d\u00f6nd\u00fc\u011f\u00fc katmana, backend soyutlama katman\u0131na. Bu katman ile geli\u015ftiriciden ald\u0131\u011f\u0131m\u0131z \u00fcst seviye \u00e7izim isteklerini DrawTriangles,\u00a0 CreateTexture,\u00a0 SetProjectionMatrix gibi daha alt seviye \u00e7a\u011fr\u0131lara d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz. Tabi bu seviyede art\u0131k, bu \u00e7a\u011fr\u0131lar OpenGL ve Vulkan&#8217;a g\u00f6re farkl\u0131l\u0131k g\u00f6steriyor. Bir di\u011fer ifadeyle, IRenderer aray\u00fcz\u00fcn\u00fc bu backend&#8217;ler i\u00e7in implement ediyor. Bu katmanlama sayesinde hem OpenGL hem de Vulkan backend&#8217;ini destekliyoruz.<\/li>\n<li><span style=\"text-decoration: underline;\"><strong>SDL3 Platform Katman\u0131<\/strong><\/span>:\u00a0Bu seviye de art\u0131k SDL ile pencere y\u00f6netimi, OpenGL context olu\u015fturma, girdilerin kotar\u0131lmas\u0131 ve benzeri i\u015fleri yap\u0131yoruz.<\/li>\n<\/ul>\n<hr \/>\n<h3><span style=\"color: #0000ff;\"><strong>IRenderer: Backend Soyutlama Aray\u00fcz\u00fc<\/strong><\/span><\/h3>\n<p>sdl-painter&#8217;\u0131n merkezinde <em>IRenderer<\/em> aray\u00fcz s\u0131n\u0131f\u0131 bulunuyor.<\/p>\n<pre class=\"lang:c++ decode:true \">namespace sdl_painter {\r\n\r\n\/\/\/ @brief Backend ba\u011f\u0131ms\u0131z soyut renderer aray\u00fcz\u00fc.\r\n\/\/\/\r\n\/\/\/ OpenGL ve Vulkan implementasyonlar\u0131 bu aray\u00fcz\u00fc uygular.\r\n\/\/\/ Painter, IRenderer \u00fczerinden \u00e7al\u0131\u015f\u0131r \u2014 backend detaylar\u0131n\u0131 bilmez.\r\nclass IRenderer {\r\n public:\r\n  virtual ~IRenderer() = default;\r\n\r\n  \/\/ Ya\u015fam d\u00f6ng\u00fcs\u00fc\r\n  virtual bool Initialize(SDL_Window* window) = 0;\r\n  virtual void Shutdown() = 0;\r\n  virtual void BeginFrame() = 0;\r\n  virtual void EndFrame() = 0;\r\n\r\n  \/\/ Durum\r\n  virtual void SetViewport(int32_t x, int32_t y,\r\n                           int32_t width, int32_t height) = 0;\r\n  virtual void SetScissor(int32_t x, int32_t y,\r\n                          int32_t width, int32_t height) = 0;\r\n  virtual void ClearScissor() = 0;\r\n  virtual void Clear(const Color&amp; color) = 0;\r\n  virtual void SetOpacity(float alpha) = 0;\r\n\r\n  \/\/ \u00c7izim primitifleri (tessellated vertex'ler)\r\n  virtual void DrawTriangles(const std::vector&lt;Vertex&gt;&amp; vertices) = 0;\r\n\r\n  \/\/ Texture i\u015flemleri\r\n  virtual TextureHandle CreateTexture(const uint8_t* data,\r\n                                      int32_t width, int32_t height,\r\n                                      int32_t channels) = 0;\r\n  virtual void DestroyTexture(TextureHandle handle) = 0;\r\n  virtual void DrawTextured(const std::vector&lt;TexturedVertex&gt;&amp; vertices,\r\n                            TextureHandle texture) = 0;\r\n\r\n  \/\/ Transform\r\n  virtual RendererBackend GetBackend() const = 0;\r\n  virtual void SetProjectionMatrix(const float* mat4) = 0;\r\n  virtual void SetModelMatrix(const float* mat3) = 0;\r\n};\r\n\r\n\/\/\/ @brief Se\u00e7ilen backend i\u00e7in IRenderer \u00f6rn\u011fi olu\u015ftur.\r\nstd::unique_ptr&lt;IRenderer&gt; CreateRenderer(RendererBackend backend);\r\n\r\n}  \/\/ namespace sdl_painter<\/pre>\n<p><em>RendererBackend <\/em>enum&#8217;u ile hangi backend kullan\u0131laca\u011f\u0131n\u0131 ifade ediyoruz:<\/p>\n<pre class=\"lang:c++ decode:true \">enum class RendererBackend {\r\n  kOpenGL,\r\n  kVulkan,\r\n};<\/pre>\n<p><strong><em>CreateRenderer\u00a0<\/em><\/strong>factory fonksiyonu ile ilgili backend implementasyonu nu heap&#8217;te olu\u015fturup <em>unique_ptr\u00a0<\/em>olarak d\u00f6nd\u00fcr\u00fcyor. Geli\u015ftirici <em>IRenderer*\u00a0<\/em>\u00fczerinden gerekli i\u015flevleri ger\u00e7ekle\u015ftiriyor; <strong><em>OpenGLRenderer<\/em>\u00a0<\/strong>ya da\u00a0<em><strong>VulkanRenderer&#8217;\u0131<\/strong> <\/em>do\u011frudan g\u00f6rm\u00fcyor.<\/p>\n<p><em><strong>TextureHandle\u00a0<\/strong><\/em>ise yine benzer \u015fekilde backend-agnostic bir tan\u0131mlay\u0131c\u0131 (uint32_t alias&#8217;\u0131), OpenGL&#8217;de texture ID, Vulkan&#8217;da descriptor index olarak kullan\u0131l\u0131yor olacak:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/\/ @brief Texture tan\u0131mlay\u0131c\u0131s\u0131 \u2014 backend-agnostic opak tip.\r\nusing TextureHandle = uint32_t;\r\n\r\n\/\/\/ @brief Ge\u00e7ersiz\/bo\u015f texture tan\u0131mlay\u0131c\u0131s\u0131.\r\nconstexpr TextureHandle kInvalidTexture = 0;<\/pre>\n<p>Bu aray\u00fczdeki \u00e7izim API&#8217;lerine in\u015fallah sonraki yaz\u0131lar\u0131mda girece\u011fiz, \u015fimdilik burada b\u0131rak\u0131yoruz ve sonraki ba\u015fl\u0131\u011fa ge\u00e7iyoruz.<\/p>\n<hr \/>\n<h3><span style=\"color: #0000ff;\"><strong>Temel Tipler<\/strong><\/span><\/h3>\n<p>Bu ba\u015fl\u0131k alt\u0131nda sdl-painter kullanarak geli\u015ftirece\u011finiz uygulamalarda, s\u0131kl\u0131kla ihtiya\u00e7 duyaca\u011f\u0131n\u0131z veya kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z tiplere de\u011finece\u011fiz, bunlar\u0131n \u00e7o\u011fu zaten kendini a\u00e7\u0131klar nitelikte, bu sebeple detaylara \u00e7ok girmeyece\u011fim. \u0130lki ile ba\u015flayal\u0131m<\/p>\n<p><strong>Color<\/strong><\/p>\n<pre class=\"lang:c++ decode:true \">struct Color {\r\n  uint8_t r{0};\r\n  uint8_t g{0};\r\n  uint8_t b{0};\r\n  uint8_t a{255};  \/\/ varsay\u0131lan: tam opak\r\n\r\n  constexpr Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255)\r\n      : r(r), g(g), b(b), a(a) {}\r\n\r\n  float RedF() const { return r \/ 255.0f; }\r\n  \/\/ ... di\u011fer kanallar\r\n\r\n  static constexpr Color Black()       { return {0, 0, 0}; }\r\n  static constexpr Color White()       { return {255, 255, 255}; }\r\n  static constexpr Color Transparent() { return {0, 0, 0, 0}; }\r\n};<\/pre>\n<p><code>RedF()<\/code> fonksiyonlar\u0131, shader uniform&#8217;lar\u0131na float g\u00f6ndermek i\u00e7in kullan\u0131yoruz, her kanal\u00a0<code>[0, 255]<\/code>\u00a0aral\u0131\u011f\u0131nda\u00a0<code>uint8_t<\/code> normalde.<\/p>\n<p><strong>Pen ve Brush<\/strong><\/p>\n<p>sdl-painter API&#8217;lerinde, <code>Pen<\/code>\u00a0\u00e7izgi stilini,\u00a0<code>Brush<\/code> dolgu stilini temsil eder.<\/p>\n<pre class=\"lang:c++ decode:true \">class Pen {\r\n public:\r\n  explicit Pen(const Color&amp; color, float width = 1.0f)\r\n      : mColor(color), mWidth(width) {}\r\n\r\n  const Color&amp; GetColor() const { return mColor; }\r\n  float GetWidth() const { return mWidth; }\r\n  bool IsVisible() const { return mColor.a &gt; 0 &amp;&amp; mWidth &gt; 0.0f; }\r\n\r\n  static Pen NoPen() { return Pen(Color::Transparent(), 0.0f); }\r\n\r\n private:\r\n  Color mColor{Color::Black()};\r\n  float mWidth{1.0f};\r\n};<\/pre>\n<p><code>NoPen()<\/code>\u00a0ve\u00a0<code>NoBrush()<\/code> factory metodlar\u0131, &#8220;\u00e7izme ama doldur&#8221; ya da &#8220;doldurma ama \u00e7iz&#8221; senaryolar\u0131 i\u00e7in kullan\u0131yor olaca\u011f\u0131z, temel olarak i\u00e7i bo\u015f dikd\u00f6rtgen ve \u00e7er\u00e7evesiz ama i\u00e7i dolu dikd\u00f6rtgen.<\/p>\n<p><strong>Vertex ve TexturedVertex<\/strong><\/p>\n<p>IRenderer&#8217;\u0131n ald\u0131\u011f\u0131 ham vertex tipleri:<\/p>\n<pre class=\"lang:c++ decode:true \">struct Vertex {\r\n  float x{0.0f};\r\n  float y{0.0f};\r\n  uint8_t r{255}, g{255}, b{255}, a{255};\r\n\r\n  constexpr Vertex(float x, float y,\r\n                   uint8_t r, uint8_t g, uint8_t b, uint8_t a)\r\n      : x(x), y(y), r(r), g(g), b(b), a(a) {}\r\n};\r\n\r\nstruct TexturedVertex {\r\n  float x{0.0f};\r\n  float y{0.0f};\r\n  float u{0.0f};  \/\/ UV koordinat\u0131\r\n  float v{0.0f};\r\n  uint8_t r{255}, g{255}, b{255}, a{255};\r\n};<\/pre>\n<p>Renk bilgisi de vertex&#8217;in i\u00e7inde ta\u015f\u0131n\u0131yor \u2014 bu sayede Tessellator her vertex&#8217;e Pen\/Brush rengini do\u011frudan yazabiliyor ve ayr\u0131 bir uniform g\u00fcncellemesi gerekmiyor.<\/p>\n<p><strong>Point, Rect, Size<\/strong><\/p>\n<p>Geometri tipleri de temelde a\u015fa\u011f\u0131daki gibi tan\u0131mlanmakta:<\/p>\n<pre class=\"lang:c++ decode:true \">struct Point { float x{0.0f}; float y{0.0f}; };\r\n\r\nstruct Rect {\r\n  float x{0.0f}, y{0.0f}, w{0.0f}, h{0.0f};\r\n\r\n  float Right()  const { return x + w; }\r\n  float Bottom() const { return y + h; }\r\n  Point Center() const { return {x + w * 0.5f, y + h * 0.5f}; }\r\n  bool  Contains(float px, float py) const;\r\n};\r\n\r\nstruct Size  { float w{0.0f}; float h{0.0f}; };<\/pre>\n<hr \/>\n<h3 id=\"build-sistemi-cmake--conan-2\" class=\"code-line\" dir=\"auto\" data-line=\"219\"><span style=\"color: #0000ff;\"><strong>Build Sistemi: CMake + Conan 2<\/strong><\/span><\/h3>\n<p id=\"conan-2--ba\u011f\u0131ml\u0131l\u0131k-y\u00f6netimi\" class=\"code-line\" dir=\"auto\" data-line=\"221\"><strong>Conan 2 \u2014 Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi<\/strong><\/p>\n<p><code>conanfile.py<\/code> t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlar ve ilgili paketleri otomatik bir \u015fekilde conan-center&#8217;dan \u00e7ekilmesine imkan sa\u011flar. Daha \u00f6nce, template ve uengine projelerinde en \u00e7ok vakit alan k\u0131s\u0131mlar asl\u0131nda bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurmak oluyordu. Burada o y\u00fck\u00fc conan y\u00fckleniyor.<\/p>\n<pre class=\"lang:python decode:true \">def requirements(self):\r\n    self.requires(\"sdl\/3.2.14\")          # SDL3 \u2014 pencere + input\r\n    self.requires(\"glad\/0.1.36\")         # OpenGL 3.3 function loader\r\n    self.requires(\"stb\/cci.20240531\")    # stb_image \u2014 header-only\r\n    self.requires(\"spdlog\/1.15.3\",\r\n                  options={\"spdlog\/*:header_only\": True})  # loglama\r\n    self.requires(\"sdl_ttf\/3.2.2\")  # Phase 4: metin \u00e7izimi\r\n\r\n    if self.options.with_vulkan:\r\n        self.requires(\"vulkan-loader\/1.3.290.0\")\r\n        self.requires(\"vulkan-headers\/1.3.290.0\")\r\n\r\n    if self.options.build_tests:\r\n        self.requires(\"gtest\/1.15.0\")<\/pre>\n<p id=\"cmakeliststxt--ana-yap\u0131\" class=\"code-line\" dir=\"auto\" data-line=\"244\"><strong>CMakeLists.txt \u2014 Ana Yap\u0131<\/strong><\/p>\n<p dir=\"auto\" data-line=\"244\">CMakelist&#8217;in genel yap\u0131s\u0131 daha \u00f6nce sizler ile payla\u015ft\u0131\u011f\u0131m, CMake \u015fablonlar\u0131na \u00e7ok benziyor:<\/p>\n<pre class=\"lang:c++ decode:true\">cmake_minimum_required(VERSION 3.20)\r\nproject(SDLPainter VERSION 0.1.0 LANGUAGES CXX)\r\n\r\nset(CMAKE_CXX_STANDARD 17)\r\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\r\nset(CMAKE_CXX_EXTENSIONS OFF)\r\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)  # clang-tidy i\u00e7in\r\n\r\n...\r\n\r\nadd_library(sdl_painter ${SDLPAINTER_SOURCES})\r\n\r\ntarget_link_libraries(sdl_painter\r\n    PUBLIC  SDL3::SDL3\r\n    PUBLIC  OpenGL::GL\r\n    PRIVATE glad::glad\r\n    PRIVATE stb::stb\r\n    PRIVATE spdlog::spdlog_header_only\r\n)<\/pre>\n<p><code>PUBLIC<\/code>\u00a0\/\u00a0<code>PRIVATE<\/code> ayr\u0131m\u0131na dikkat etmenizde fayda var dostlar. <code>SDL3<\/code>\u00a0 ve <code>OpenGL<\/code>\u00a0 public, \u00e7\u00fcnk\u00fc geli\u015ftirici kodu da bu header&#8217;lara dolayl\u0131 olarak ba\u011f\u0131ml\u0131. <code>glad<\/code>\u00a0ve\u00a0<code>stb<\/code> ise ger\u00e7ekleme detay\u0131 oldu\u011fu i\u00e7in, kullan\u0131c\u0131 uygulamalar\u0131na ge\u00e7irilmesine gerek yok.<\/p>\n<p>OpenGL ve Vulkan uygulamalar\u0131nda \u00f6zellikle ihtiya\u00e7 duyaca\u011f\u0131n\u0131z shader dosyalar\u0131 i\u00e7in de sat\u0131rlar mevcut:<\/p>\n<pre class=\"lang:c++ decode:true \">function(sdlpainter_copy_shaders target)\r\n    # MSVC: $&lt;TARGET_FILE_DIR&gt; ile multi-config deste\u011fi\r\n    # Ninja\/Make: configure zaman\u0131nda sabit dizine kopyala\r\nendfunction()\r\n\r\nfunction(sdlpainter_copy_vulkan_shaders target)\r\n    #  ...\r\nendfunction()<\/pre>\n<p><strong>CMake Presetleri<\/strong><\/p>\n<p>Projedeki t\u00fcm yap\u0131land\u0131rmalar\u0131 <code>CMakePresets.json<\/code> i\u00e7inde tan\u0131mlad\u0131k. Bunun g\u00fczel yan\u0131: lokalde \u00e7al\u0131\u015ft\u0131r\u0131lan komutlar CI&#8217;da \u00e7al\u0131\u015fan komutlar ile <strong>birebir ayn\u0131<\/strong>. Bu sayede iki ortam aras\u0131nda olu\u015fabilecek farkl\u0131l\u0131klar\u0131n \u00f6n\u00fcne ge\u00e7mi\u015f oluyoruz.<\/p>\n<table class=\"code-line\" dir=\"auto\" data-line=\"285\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"285\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"285\">\n<th>Preset<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"287\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"287\">\n<td><code>linux-debug<\/code>\u00a0\/\u00a0<code>linux-release<\/code><\/td>\n<td>Ninja + GCC, CI&#8217;daki ana build&#8217;ler<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"288\">\n<td><code>linux-debug-asan<\/code><\/td>\n<td>AddressSanitizer + UBSan aktif debug build<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"289\">\n<td><code>windows-debug<\/code>\u00a0\/\u00a0<code>windows-release<\/code><\/td>\n<td>Visual Studio 2022 (MSVC), native Windows<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"290\">\n<td><code>windows-mingw-debug<\/code>\u00a0\/\u00a0<code>windows-mingw-release<\/code><\/td>\n<td>Linux&#8217;tan MinGW-w64 ile Windows cross-compile<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"code-line\" dir=\"auto\" data-line=\"292\">Her preset kendi\u00a0<code>build\/&lt;preset-ad\u0131&gt;\/<\/code> dizinine, Conan&#8217;\u0131n o preset i\u00e7in \u00fcretti\u011fi toolchain dosyas\u0131n\u0131 g\u00f6stererek yap\u0131land\u0131r\u0131l\u0131yoruz. Yani bir preset = bir Conan kurulumu + bir build dizini.<\/p>\n<p dir=\"auto\" data-line=\"292\">Derleme i\u00e7in izlenebilecek \u00f6rnek ad\u0131mlar\u0131 \u015f\u00f6yle s\u0131ralayabiliriz:<\/p>\n<pre class=\"lang:zsh decode:true\"># Conan profili (ilk seferinde)\r\nconan profile detect\r\n\r\n# Debug ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\r\nconan install . --output-folder=build\/linux-debug\/generators --build=missing -s build_type=Debug\r\n\r\n# Configure + build\r\ncmake --preset linux-debug\r\ncmake --build --preset linux-debug\r\n\r\n# Testleri \u00e7al\u0131\u015ft\u0131r\r\nctest --preset linux-debug<\/pre>\n<p>Bu arada dikkatli takip\u00e7ilerim, bu komutlar\u0131 bu \u015fekilde \u00e7a\u011f\u0131rman\u0131za gerek olmad\u0131\u011f\u0131n\u0131 da fark etmi\u015ftir. <strong>\/scripts<\/strong> dizini alt\u0131nda farkl\u0131 platformlar i\u00e7in gerekli betikler mevcut \ud83d\ude09<\/p>\n<p>Bunun yan\u0131nda kullanabilece\u011finiz temel bir tak\u0131m profil dosyalar\u0131n\u0131 da sizlerle ilerleyen d\u00f6nemde payla\u015faca\u011f\u0131m.<\/p>\n<hr \/>\n<h3><span style=\"color: #0000ff;\"><strong>Neden OpenGL 3.3?<\/strong><\/span><\/h3>\n<p>\u0130lk yaz\u0131da k\u0131saca de\u011findi\u011fim bir di\u011fer konu da opengl 3.3 kullan\u0131m\u0131yd\u0131.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"318\">Mimari kararlar\u0131 kay\u0131t alt\u0131na almak i\u00e7in bildi\u011finiz gibi ADR (Architecture Decision Record) format\u0131n\u0131 kullan\u0131yoruz (buna y\u00f6nelik de bir yaz\u0131m mevcut). Bu konuya y\u00f6nelik de ADR-001&#8217;i olu\u015fturduk. Detaylara ilgili dok\u00fcmandan ula\u015fabilirsiniz. K\u0131saca alternatiflere bakacak olursak:<\/p>\n<table class=\"code-line\" dir=\"auto\" data-line=\"322\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"322\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"322\">\n<th>Se\u00e7enek<\/th>\n<th>Neden reddedildi<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"324\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"324\">\n<td>OpenGL 2.1<\/td>\n<td>Deprecated; fixed-function pipeline; VAO yok<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"325\">\n<td>OpenGL 4.5+<\/td>\n<td>macOS deste\u011fi yok (Apple 4.1&#8217;de tak\u0131l\u0131)<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"326\">\n<td>OpenGL ES 2.0<\/td>\n<td>Desktop&#8217;ta s\u0131n\u0131rl\u0131 destek<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"327\">\n<td>Vulkan (Phase 0)<\/td>\n<td>Y\u00fcksek kurulum maliyeti; 2D i\u00e7in fazla karma\u015f\u0131k<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"code-line\" dir=\"auto\" data-line=\"329\"><strong>OpenGL 3.3 Core Profile<\/strong>\u00a0se\u00e7iminin gerek\u00e7esi:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"331\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"331\">2012 sonras\u0131 t\u00fcm masa\u00fcst\u00fc GPU&#8217;larda destekleniyor,<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"332\">VAO, VBO, UBO, GLSL 330 \u2014 2D k\u00fct\u00fcphane i\u00e7in gereken her \u015fey mevcut,<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"333\"><strong>Core Profile:<\/strong> fixed-function pipeline kald\u0131r\u0131lm\u0131\u015f amd davran\u0131\u015f tahmin edilebilir.<\/li>\n<\/ul>\n<hr \/>\n<h3><strong><span style=\"color: #0000ff;\">Faz 0 Demomuz, \u0130lk SDL Penceresi<\/span><\/strong><\/h3>\n<p>Asl\u0131nda bu yaz\u0131mda CI\/CD konular\u0131na da girecektim ama yaz\u0131 \u00e7ok uzad\u0131, onun i\u00e7in faz 0 \u00f6rnek uygulamas\u0131 ile tamamlamaya karar verdim.<\/p>\n<p>Faz 0 demosu asl\u0131nda ger\u00e7ek \u00e7izim yapm\u0131yor, bununla birlikte altyap\u0131n\u0131n derlendi\u011fini ve \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011fruluyor. Ayn\u0131 zamanda loglama sistemini de test ediyor:<\/p>\n<pre class=\"lang:c++ decode:true\">static void InitLogger() {\r\n#ifdef _WIN32\r\n  \/\/ Windows Terminal'de ANSI renk kodlar\u0131n\u0131 etkinle\u015ftir\r\n  HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);\r\n  DWORD dwMode = 0;\r\n  GetConsoleMode(hOut, &amp;dwMode);\r\n  SetConsoleMode(hOut, dwMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);\r\n#endif\r\n\r\n  auto sink = std::make_shared&lt;spdlog::sinks::ansicolor_stdout_sink_mt&gt;();\r\n  sink-&gt;set_pattern(\"[%H:%M:%S][%L] %v\");\r\n\r\n  auto logger = std::make_shared&lt;spdlog::logger&gt;(\"sdlpainter\", sink);\r\n  logger-&gt;set_level(spdlog::level::trace);\r\n  spdlog::set_default_logger(logger);\r\n}\r\n\r\nint main() {\r\n  InitLogger();\r\n  spdlog::info(\"SDLPainter Phase 0 demo starting...\");\r\n\r\n  if (!SDL_Init(SDL_INIT_VIDEO)) {\r\n    spdlog::error(\"SDL_Init failed: {}\", SDL_GetError());\r\n    return 1;\r\n  }\r\n\r\n  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);\r\n  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);\r\n  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,\r\n                      SDL_GL_CONTEXT_PROFILE_CORE);\r\n\r\n  SDL_Window* window = SDL_CreateWindow(\r\n      \"SDLPainter \u2014 Phase 0 Demo\", 800, 600, SDL_WINDOW_OPENGL);\r\n  if (!window) {\r\n    spdlog::error(\"SDL_CreateWindow failed: {}\", SDL_GetError());\r\n    SDL_Quit();\r\n    return 1;\r\n  }\r\n\r\n  spdlog::info(\"Window created (800x600). Press ESC to exit.\");\r\n\r\n  bool running = true;\r\n  while (running) {\r\n    SDL_Event event;\r\n    while (SDL_PollEvent(&amp;event)) {\r\n      if (event.type == SDL_EVENT_QUIT) running = false;\r\n      if (event.type == SDL_EVENT_KEY_DOWN &amp;&amp;\r\n          event.key.key == SDLK_ESCAPE)   running = false;\r\n    }\r\n  }\r\n\r\n  SDL_DestroyWindow(window);\r\n  SDL_Quit();\r\n  return 0;\r\n}<\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"409\">Dikkat ettiyseniz SDL3&#8217;te <code>SDL_Init<\/code>\u00a0ba\u015far\u0131s\u0131z oldu\u011funda\u00a0<code>false<\/code> d\u00f6nd\u00fcr\u00fcyor \u2014 SDL2&#8217;deki negatif integer yerine, buna da SDL3&#8217;e y\u00f6nelik yaz\u0131mda de\u011finmi\u015ftim. Fakat, bu API de\u011fi\u015fiklikleri genelde SDL3&#8217;e ge\u00e7i\u015fte kar\u015f\u0131la\u015f\u0131lan en yayg\u0131n derleme hatalar\u0131ndan birisi.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"411\">Bu arada, loglama i\u00e7in de<code>spdlog<\/code>\u00a0kullan\u0131yoruz.\u00a0<code>[%H:%M:%S][%L]<\/code> format\u0131 zaman\u0131 bize veriyor ve kay\u0131tlar\u0131 daha okunabilir k\u0131l\u0131yor.<\/p>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda \u00e7\u0131kt\u0131 \u015f\u00f6yle olmal\u0131:<\/p>\n<pre class=\"lang:zsh decode:true\">.\\build\\windows-debug\\examples\\Debug\\phase0_demo.exe                                                        \r\n[00:16:40][I] SDLPainter Phase 0 demo starting...\r\n[00:16:40][I] SDL initialized successfully.\r\n[00:16:41][I] Window created (800x600).\r\n[00:16:41][W] This is a warn-level log sample.\r\n[00:16:41][I] Close the window or press ESC to exit.<\/pre>\n<hr \/>\n<h3><span style=\"color: #0000ff;\"><strong>Sonu\u00e7<\/strong><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"587\">\u0130lk yaz\u0131m\u0131zla faz-0 a\u015famas\u0131n\u0131 tamaml\u0131yoruz. Peki nelere de\u011findik bu yaz\u0131mda:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"589\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"435\">Katmanl\u0131 bir mimarimiz var \u2014 Painter, Tessellator, IRenderer, Backend<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"436\"><code>IRenderer<\/code> aray\u00fcz\u00fc \u00f6nemli \u2014 OpenGL ve Vulkan i\u00e7in ortak s\u00f6zle\u015fme<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"437\">Temel tiplerimiz \u2014 Color, Pen, Brush, Vertex, Point\/Rect\/Size<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"438\">CMake + Conan 2 build sistemi \u2014 cross-platform, preset destekli,<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"439\">OpenGL 3.3 Core se\u00e7im karar\u0131m\u0131z,<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"442\">\u00c7al\u0131\u015fan bir SDL3 penceresi.<\/li>\n<\/ul>\n<p class=\"code-line\" dir=\"auto\" data-line=\"600\">\u00d6nemli konular\u0131 inceledikten sonra art\u0131k \u00e7izim ve di\u011fer konulara girmeye haz\u0131r\u0131z. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere, bol kodlu g\u00fcnler.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C++ kullanarak 2B uygulama geli\u015ftirme i\u00e7in biricik yard\u0131mc\u0131n\u0131z olacak olan sdl-painter maceram\u0131za devam ediyoruz. Okumayanlar i\u00e7in ilk yaz\u0131m\u0131n ba\u011flant\u0131s\u0131n\u0131 a\u015fa\u011f\u0131ya koyuyorum. Bir g\u00f6z atman\u0131zda fayda var. [Duyuru] sdl-painter \u00d6zetle, sdl-painter, SDL3 + OpenGL 3.3 Core ve Vulkan 1.1 ile modern C++ kullan\u0131larak , \u00e7oklu platform deste\u011fi sunan, sa\u011flam ve g\u00fcncel bir yaz\u0131l\u0131m altyap\u0131s\u0131 ve ara\u00e7lar\u0131&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,25],"tags":[1215,155,260,52,334,1214,1155,1213,1208],"class_list":["post-3135","post","type-post","status-publish","format-standard","hentry","category-c","category-modern-c","category-oyun-gelistirme","tag-2d-programming","tag-cmake","tag-conan","tag-game-development","tag-opengl","tag-sdl-painter","tag-sdl3","tag-sdlpainter","tag-vulkan"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>sdl-painter - Proje Altyap\u0131s\u0131 (faz-0) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"sdl-painter - Proje Altyap\u0131s\u0131 (faz-0) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"C++ kullanarak 2B uygulama geli\u015ftirme i\u00e7in biricik yard\u0131mc\u0131n\u0131z olacak olan sdl-painter maceram\u0131za devam ediyoruz. Okumayanlar i\u00e7in ilk yaz\u0131m\u0131n ba\u011flant\u0131s\u0131n\u0131 a\u015fa\u011f\u0131ya koyuyorum. Bir g\u00f6z atman\u0131zda fayda var. [Duyuru] sdl-painter \u00d6zetle, sdl-painter, SDL3 + OpenGL 3.3 Core ve Vulkan 1.1 ile modern C++ kullan\u0131larak , \u00e7oklu platform deste\u011fi sunan, sa\u011flam ve g\u00fcncel bir yaz\u0131l\u0131m altyap\u0131s\u0131 ve ara\u00e7lar\u0131... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-03T16:56:28+00:00\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"sdl-painter &#8211; Proje Altyap\u0131s\u0131 (faz-0)\",\"datePublished\":\"2026-07-03T16:56:28+00:00\",\"dateModified\":\"2026-07-03T16:56:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\"},\"wordCount\":1570,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"2d programming\",\"CMAKE\",\"conan\",\"Game Development\",\"OpenGL\",\"sdl-painter\",\"SDL3\",\"sdlpainter\",\"vulkan\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Oyun Geli\u015ftirme\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\",\"name\":\"sdl-painter - Proje Altyap\u0131s\u0131 (faz-0) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2026-07-03T16:56:28+00:00\",\"dateModified\":\"2026-07-03T16:56:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"sdl-painter &#8211; Proje Altyap\u0131s\u0131 (faz-0)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"sdl-painter - Proje Altyap\u0131s\u0131 (faz-0) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/","og_locale":"tr_TR","og_type":"article","og_title":"sdl-painter - Proje Altyap\u0131s\u0131 (faz-0) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"C++ kullanarak 2B uygulama geli\u015ftirme i\u00e7in biricik yard\u0131mc\u0131n\u0131z olacak olan sdl-painter maceram\u0131za devam ediyoruz. Okumayanlar i\u00e7in ilk yaz\u0131m\u0131n ba\u011flant\u0131s\u0131n\u0131 a\u015fa\u011f\u0131ya koyuyorum. Bir g\u00f6z atman\u0131zda fayda var. [Duyuru] sdl-painter \u00d6zetle, sdl-painter, SDL3 + OpenGL 3.3 Core ve Vulkan 1.1 ile modern C++ kullan\u0131larak , \u00e7oklu platform deste\u011fi sunan, sa\u011flam ve g\u00fcncel bir yaz\u0131l\u0131m altyap\u0131s\u0131 ve ara\u00e7lar\u0131... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2026-07-03T16:56:28+00:00","author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"7 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"sdl-painter &#8211; Proje Altyap\u0131s\u0131 (faz-0)","datePublished":"2026-07-03T16:56:28+00:00","dateModified":"2026-07-03T16:56:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/"},"wordCount":1570,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["2d programming","CMAKE","conan","Game Development","OpenGL","sdl-painter","SDL3","sdlpainter","vulkan"],"articleSection":["C++","Modern C++","Oyun Geli\u015ftirme"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/","name":"sdl-painter - Proje Altyap\u0131s\u0131 (faz-0) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2026-07-03T16:56:28+00:00","dateModified":"2026-07-03T16:56:28+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"sdl-painter &#8211; Proje Altyap\u0131s\u0131 (faz-0)"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=3135"}],"version-history":[{"count":8,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3135\/revisions"}],"predecessor-version":[{"id":3144,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3135\/revisions\/3144"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=3135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=3135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=3135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}