diff --git a/main-ambient.c b/main-ambient.c
index fc020ee..cabbf0e 100644
--- a/main-ambient.c
+++ b/main-ambient.c
@@ -151,15 +151,25 @@ int main(int argc, char **argv) {
   // シェーダーファイルを読み込む
 #ifdef __APPLE__
   char *vertexShaderSource = readShaderFile("shader/vertex.mac.glsl");
   char *fragmentShaderSource = readShaderFile("shader/fragment.mac.glsl");
+  char *fragmentAmbientSource = readShaderFile("shader/frag_ambient.mac.glsl");
 #else
   char *vertexShaderSource = readShaderFile("shader/vertex.glsl");
   char *fragmentShaderSource = readShaderFile("shader/fragment.glsl");
+  char *fragmentAmbientSource = readShaderFile("shader/frag_ambient.glsl");
 #endif
-  if (!vertexShaderSource || !fragmentShaderSource) {
+  if (!vertexShaderSource || !vertexDirectionalSource || !fragmentShaderSource || !fragmentAmbientSource) {
     puts("シェーダーファイルの読み込みに失敗しました");
     if (vertexShaderSource) free(vertexShaderSource);
     if (fragmentShaderSource) free(fragmentShaderSource);
+    if (fragmentAmbientSource) free(fragmentAmbientSource);
     glfwDestroyWindow(window);
     glfwTerminate();
     return -1;
@@ -171,32 +181,81 @@ int main(int argc, char **argv) {
   glCompileShader(vertexShader);
   checkShaderCompile(vertexShader);
 
   GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
   glShaderSource(fragmentShader, 1, (const char **)&fragmentShaderSource, NULL);
   glCompileShader(fragmentShader);
   checkShaderCompile(fragmentShader);
 
-  // シェーダープログラムをリンク
+  GLuint fragmentAmbientShader = glCreateShader(GL_FRAGMENT_SHADER);
+  glShaderSource(fragmentAmbientShader, 1, (const char **)&fragmentAmbientSource, NULL);
+  glCompileShader(fragmentAmbientShader);
+  checkShaderCompile(fragmentAmbientShader);
+
+  // 三角形のシェーダープログラムをリンク
   GLuint shaderProgram = glCreateProgram();
   glAttachShader(shaderProgram, vertexShader);
   glAttachShader(shaderProgram, fragmentShader);
   glLinkProgram(shaderProgram);
   checkProgramLink(shaderProgram);
 
+  // アンビエントシェーダープログラムをリンク
+  GLuint ambientShaderProgram = glCreateProgram();
+  glAttachShader(ambientShaderProgram, vertexShader);
+  glAttachShader(ambientShaderProgram, fragmentAmbientShader);
+  glLinkProgram(ambientShaderProgram);
+  checkProgramLink(ambientShaderProgram);
+
   glDeleteShader(vertexShader);
   glDeleteShader(fragmentShader);
+  glDeleteShader(fragmentAmbientShader);
   free(vertexShaderSource);
+  free(vertexDirectionalSource);
   free(fragmentShaderSource);
+  free(fragmentAmbientSource);
 
-  // 頂点データ（フルスクリーンクアッド）を設定
+  // 頂点データ（三角形）を設定：三角形用（左にオフセット）
   float vertices[] = {
-    -1.0f, -1.0f, 0.0f, 0.0f, // 左下（位置、UV）
-     1.0f, -1.0f, 1.0f, 0.0f, // 右下
-     1.0f,  1.0f, 1.0f, 1.0f, // 右上
-    -1.0f,  1.0f, 0.0f, 1.0f  // 左上
+    -0.8f, -0.5f, 0.0f, 0.0f, // 左下（位置、UV）
+    -0.3f, -0.5f, 1.0f, 0.0f, // 右下
+    -0.55f, 0.5f, 0.5f, 1.0f  // 上
+  };
+  GLuint indices[] = { 0, 1, 2 };
+
+  // 頂点データ（三角形）を設定：アンビエント用（右にオフセット）
+  float verticesAmbient[] = {
+     0.3f, -0.5f, 0.0f, 0.0f, // 左下（位置、UV）
+     0.8f, -0.5f, 1.0f, 0.0f, // 右下
+     0.55f, 0.5f, 0.5f, 1.0f  // 上
+  };
-  GLuint indices[] = { 0, 1, 2, 2, 3, 0 };
 
+  // VAO、VBO、EBOを三角形用に設定
   GLuint VAO, VBO, EBO;
   glGenVertexArrays(1, &VAO);
   glGenBuffers(1, &VBO);
@@ -208,13 +267,44 @@ int main(int argc, char **argv) {
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
-  頂点属性：位置（location 0）、UV（location 1）
   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)0);
   glEnableVertexAttribArray(0);
   size_t offset = 2 * sizeof(float);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)offset);
   glEnableVertexAttribArray(1);
 
+  // VAO、VBO、EBOをアンビエント用に設定
+  GLuint VAOAmbient, VBOAmbient, EBOAmbient;
+  glGenVertexArrays(1, &VAOAmbient);
+  glGenBuffers(1, &VBOAmbient);
+  glGenBuffers(1, &EBOAmbient);
+
+  glBindVertexArray(VAOAmbient);
+  glBindBuffer(GL_ARRAY_BUFFER, VBOAmbient);
+  glBufferData(GL_ARRAY_BUFFER, sizeof(verticesAmbient), verticesAmbient, GL_STATIC_DRAW);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOAmbient);
+  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
+
   // メインレンダリングループ
   while (!glfwWindowShouldClose(window)) {
     // 画面をクリア
@@ -254,7 +344,29 @@ int main(int argc, char **argv) {
 
     // クアッドを描画
     glBindVertexArray(VAO);
-    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
+
+    // アンビエントシェーダープログラムを使用（右の三角形）
+    glUseProgram(ambientShaderProgram);
+
+    // ユニフォームを設定（アンビエントシェーダー）
+    Vector3 materialColor = { 0.8f, 0.2f, 0.3f }; // 赤みがかった色
+    Vector3 lightDirection = { -0.5f, -0.5f, -0.707f }; // ライトの方向（正規化不要、シェーダーで処理）
+    float ambientIntensity = 0.6f; // アンビエント光の強さ（0.0～1.0）
+
+    glUniform3f(glGetUniformLocation(directionalShaderProgram, "materialColor"), materialColor.r, materialColor.g, materialColor.b);
+    glUniform3f(glGetUniformLocation(directionalShaderProgram, "lightDirection"), lightDirection.x, lightDirection.y, lightDirection.z);
+    glUniform1f(glGetUniformLocation(ambientShaderProgram, "ambientIntensity"), ambientIntensity);
+
+    // 右の三角形を描画（アンビエントシェーダー）
+    glBindVertexArray(VAOAmbient);
+    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
 
     // バッファをスワップし、イベントを処理
     glfwSwapBuffers(window);
@@ -265,9 +377,17 @@ int main(int argc, char **argv) {
   glDeleteVertexArrays(1, &VAO);
   glDeleteBuffers(1, &VBO);
   glDeleteBuffers(1, &EBO);
+  glDeleteVertexArrays(1, &VAOAmbient);
+  glDeleteBuffers(1, &VBOAmbient);
+  glDeleteBuffers(1, &EBOAmbient);
   glDeleteProgram(shaderProgram);
+  glDeleteProgram(ambientShaderProgram);
   glfwDestroyWindow(window);
   glfwTerminate();
 
   return 0;
-}
+}
\ No newline at end of file
diff --git a/main-directional.c b/main-directional.c
index fc020ee..cabbf0e 100644
--- a/main-directional.c
+++ b/main-directional.c
@@ -151,15 +151,25 @@ int main(int argc, char **argv) {
   // シェーダーファイルを読み込む
 #ifdef __APPLE__
   char *vertexShaderSource = readShaderFile("shader/vertex.mac.glsl");
+  char *vertexDirectionalSource = readShaderFile("shader/vertex_directional.mac.glsl");
   char *fragmentShaderSource = readShaderFile("shader/fragment.mac.glsl");
+  char *fragmentDirectionalSource = readShaderFile("shader/frag_directional.mac.glsl");
 #else
   char *vertexShaderSource = readShaderFile("shader/vertex.glsl");
+  char *vertexDirectionalSource = readShaderFile("shader/vertex_directional.glsl");
   char *fragmentShaderSource = readShaderFile("shader/fragment.glsl");
+  char *fragmentDirectionalSource = readShaderFile("shader/frag_directional.glsl");
 #endif
-  if (!vertexShaderSource || !fragmentShaderSource) {
+  if (!vertexShaderSource || !vertexDirectionalSource || !fragmentShaderSource || !fragmentDirectionalSource) {
     puts("シェーダーファイルの読み込みに失敗しました");
     if (vertexShaderSource) free(vertexShaderSource);
+    if (vertexDirectionalSource) free(vertexDirectionalSource);
     if (fragmentShaderSource) free(fragmentShaderSource);
+    if (fragmentDirectionalSource) free(fragmentDirectionalSource);
     glfwDestroyWindow(window);
     glfwTerminate();
     return -1;
@@ -171,32 +181,81 @@ int main(int argc, char **argv) {
   glCompileShader(vertexShader);
   checkShaderCompile(vertexShader);
 
+  GLuint vertexDirectionalShader = glCreateShader(GL_VERTEX_SHADER);
+  glShaderSource(vertexDirectionalShader, 1, (const char **)&vertexDirectionalSource, NULL);
+  glCompileShader(vertexDirectionalShader);
+  checkShaderCompile(vertexDirectionalShader);
+
   GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
   glShaderSource(fragmentShader, 1, (const char **)&fragmentShaderSource, NULL);
   glCompileShader(fragmentShader);
   checkShaderCompile(fragmentShader);
 
+  GLuint fragmentDirectionalShader = glCreateShader(GL_FRAGMENT_SHADER);
+  glShaderSource(fragmentDirectionalShader, 1, (const char **)&fragmentDirectionalSource, NULL);
+  glCompileShader(fragmentDirectionalShader);
+  checkShaderCompile(fragmentDirectionalShader);
+
+  // 三角形のシェーダープログラムをリンク
   GLuint shaderProgram = glCreateProgram();
   glAttachShader(shaderProgram, vertexShader);
   glAttachShader(shaderProgram, fragmentShader);
   glLinkProgram(shaderProgram);
   checkProgramLink(shaderProgram);
 
+  // ディレクショナルシェーダープログラムをリンク
+  GLuint directionalShaderProgram = glCreateProgram();
+  glAttachShader(directionalShaderProgram, vertexDirectionalShader);
+  glAttachShader(directionalShaderProgram, fragmentDirectionalShader);
+  glLinkProgram(directionalShaderProgram);
+  checkProgramLink(directionalShaderProgram);
+
   glDeleteShader(vertexShader);
+  glDeleteShader(vertexDirectionalShader);
   glDeleteShader(fragmentShader);
+  glDeleteShader(fragmentDirectionalShader);
   free(vertexShaderSource);
+  free(vertexDirectionalSource);
   free(fragmentShaderSource);
+  free(fragmentDirectionalSource);
 
-  // 頂点データ（フルスクリーンクアッド）を設定
+  // 頂点データ（三角形）を設定：三角形用（左にオフセット）
   float vertices[] = {
-    -1.0f, -1.0f, 0.0f, 0.0f, // 左下（位置、UV）
-     1.0f, -1.0f, 1.0f, 0.0f, // 右下
-     1.0f,  1.0f, 1.0f, 1.0f, // 右上
-    -1.0f,  1.0f, 0.0f, 1.0f  // 左上
+    -0.8f, -0.5f, 0.0f, 0.0f, // 左下（位置、UV）
+    -0.3f, -0.5f, 1.0f, 0.0f, // 右下
+    -0.55f, 0.5f, 0.5f, 1.0f  // 上
+  };
+  GLuint indices[] = { 0, 1, 2 };
+
+  // 頂点データ（三角形）を設定：ディレクショナル用（右にオフセット）
+  float verticesDirectional[] = {
+     0.3f, -0.5f, 0.0f, 0.0f, -0.5f, -0.5f, 0.707f, // 左下（位置、UV、形動ノーマル）
+     0.8f, -0.5f, 1.0f, 0.0f,  0.5f, -0.5f, 0.707f, // 右下
+     0.55f, 0.5f, 0.5f, 1.0f,  0.0f,  0.5f, 0.707f  // 上
   };
-  GLuint indices[] = { 0, 1, 2, 2, 3, 0 };
 
+  // VAO、VBO、EBOを三角形用に設定
   GLuint VAO, VBO, EBO;
   glGenVertexArrays(1, &VAO);
   glGenBuffers(1, &VBO);
@@ -208,13 +267,44 @@ int main(int argc, char **argv) {
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
-  // 頂点属性：位置（location 0）、UV（location 1）
+  // 頂点属性：位置（location 0）、UV（location 1）、ノーマル (2)
   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)0);
   glEnableVertexAttribArray(0);
   size_t offset = 2 * sizeof(float);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)offset);
   glEnableVertexAttribArray(1);
+
+  // VAO、VBO、EBOをディレクショナル用に設定
+  GLuint VAODirectional, VBODirectional, EBODirectional;
+  glGenVertexArrays(1, &VAODirectional);
+  glGenBuffers(1, &VBODirectional);
+  glGenBuffers(1, &EBODirectional);
+
+  glBindVertexArray(VAODirectional);
+  glBindBuffer(GL_ARRAY_BUFFER, VBODirectional);
+  glBufferData(GL_ARRAY_BUFFER, sizeof(verticesDirectional), verticesDirectional, GL_STATIC_DRAW);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBODirectional);
+  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
+
+  glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void *)0);
+  glEnableVertexAttribArray(0);
+  glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void *)(2 * sizeof(float)));
+  glEnableVertexAttribArray(1);
+  glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void *)(4 * sizeof(float)));
+  glEnableVertexAttribArray(2);
+
   // メインレンダリングループ
   while (!glfwWindowShouldClose(window)) {
     // 画面をクリア
@@ -254,7 +344,29 @@ int main(int argc, char **argv) {
 
     // クアッドを描画
     glBindVertexArray(VAO);
-    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
+
+    // ディレクショナルシェーダープログラムを使用（右の三角形）
+    glUseProgram(directionalShaderProgram);
+
+    // ユニフォームを設定（アンビエントシェーダー）
+    Vector3 materialColor = { 0.8f, 0.2f, 0.3f }; // 赤みがかった色
+    Vector3 lightDirection = { -0.5f, -0.5f, -0.707f }; // ライトの方向（正規化不要、シェーダーで処理）
+    float lightIntensity = 1.0f; // ライトの強さ（0.0～1.0）
+
+    glUniform3f(glGetUniformLocation(directionalShaderProgram, "materialColor"), materialColor.r, materialColor.g, materialColor.b);
+    glUniform3f(glGetUniformLocation(directionalShaderProgram, "lightDirection"), lightDirection.x, lightDirection.y, lightDirection.z);
+    glUniform1f(glGetUniformLocation(directionalShaderProgram, "lightIntensity"), lightIntensity);
+
+    // 右の三角形を描画（ディレクショナルシェーダー）
+    glBindVertexArray(VAODirectional);
+    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
 
     // バッファをスワップし、イベントを処理
     glfwSwapBuffers(window);
@@ -265,9 +377,17 @@ int main(int argc, char **argv) {
   glDeleteVertexArrays(1, &VAO);
   glDeleteBuffers(1, &VBO);
   glDeleteBuffers(1, &EBO);
+  glDeleteVertexArrays(1, &VAODirectional);
+  glDeleteBuffers(1, &VBODirectional);
+  glDeleteBuffers(1, &EBODirectional);
   glDeleteProgram(shaderProgram);
+  glDeleteProgram(directionalShaderProgram);
   glfwDestroyWindow(window);
   glfwTerminate();
 
   return 0;
-}
+}
\ No newline at end of file
diff --git a/shader/frag_ambient.glsl b/shader/frag_ambient.glsl
new file mode 100644
index 0000000..d7a0725
--- a/shader/frag_ambient.glsl
+++ b/shader/frag_ambient.glsl
@@ -0,0 +1,12 @@
+#version 450 core
+
+in vec2 uVu;
+out vec4 out_color;
+
+uniform vec3 materialColor;
+uniform float ambientIntensity;
+
+void main() {
+  vec3 ambient = materialColor * ambientIntensity;
+  out_color = vec4(ambient, 1.0);
+}
\ No newline at end of file
diff --git a/shader/frag_directional.glsl b/shader/frag_directional.glsl
new file mode 100644
index 0000000..1c1eb84
--- a/shader/frag_directional.glsl
+++ b/shader/frag_directional.glsl
@@ -0,0 +1,17 @@
+#version 450 core
+
+in vec2 vUv;
+in vec3 vNormal;
+out vec4 out_color;
+
+uniform vec3 materialColor;
+uniform vec3 lightDirection;
+uniform float lightIntensity;
+
+void main() {
+  vec3 normal = normalize(vNormal);
+
+  float diffuseFactor = max(dot(normal, -normalize(lightDirection)), 0.0);
+  vec3 diffuse = materialColor * diffuseFactor * lightIntensity;
+  out_color = vec4(diffuse, 1.0);
+}
\ No newline at end of file
diff --git a/shader/vertex_directional.glsl b/shader/vertex_directional.glsl
new file mode 100644
index 0000000..a275793
--- a/shader/vertex_directional.glsl
+++ b/shader/vertex_directional.glsl
@@ -0,0 +1,14 @@
+#version 450 core
+
+layout(location = 0) in vec2 aPosition;
+layout(location = 1) in vec2 aUv;
+layout(location = 2) in vec3 aNormal;
+
+out vec2 vUv;
+out vec3 vNormal;
+
+void main() {
+  vUv = aUv;
+  vNormal = aNormal;
+  gl_Position = vec4(aPosition, 0.0, 1.0);
+}
\ No newline at end of file
