draw triangle

This commit is contained in:
Zack Buhman 2025-12-04 08:53:38 -06:00
parent c098a3d0b9
commit e2a45d1bec
4 changed files with 97 additions and 56 deletions

View File

@ -87,6 +87,7 @@ clean:
MAIN_OBJS = \ MAIN_OBJS = \
src/main.o \ src/main.o \
src/glad.o \ src/glad.o \
src/opengl.o \
$(patsubst %.glsl,%.glsl.o,$(wildcard src/shader/*.glsl)) \ $(patsubst %.glsl,%.glsl.o,$(wildcard src/shader/*.glsl)) \
$(GLFW) $(GLFW)

View File

@ -7,9 +7,13 @@
#include "shader/vertex_color.fp.glsl.h" #include "shader/vertex_color.fp.glsl.h"
#include "shader/vertex_color.vp.glsl.h" #include "shader/vertex_color.vp.glsl.h"
#include "opengl.h"
static int vp_width = 800; static int vp_width = 800;
static int vp_height = 600; static int vp_height = 600;
typedef unsigned int uint;
void framebuffer_size_callback(GLFWwindow* window, int width, int height) void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{ {
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
@ -59,16 +63,17 @@ int main()
// buffer initialization // buffer initialization
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
/* uint triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER,
unsigned int triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER,
triangle_vertex_buffer_data, triangle_vertex_buffer_data,
(sizeof (triangle_vertex_buffer_data))); (sizeof (triangle_vertex_buffer_data)));
*/
/* uint vertex_color_program = compile_shader(src_shader_vertex_color_vp_glsl_start,
vertex_color.program = compile_shaders("src/vertex_color.vp.glsl", src_shader_vertex_color_vp_glsl_size,
"src/vertex_color_fp_render.fp.glsl"); src_shader_vertex_color_fp_glsl_start,
*/ src_shader_vertex_color_fp_glsl_size);
glUseProgram(vertex_color_program);
uint vertex_color_attrib_position = glGetAttribLocation(vertex_color_program, "position");
uint vertex_color_attrib_color = glGetAttribLocation(vertex_color_program, "color");
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// main loop // main loop
@ -82,6 +87,29 @@ int main()
while(!glfwWindowShouldClose(window)) { while(!glfwWindowShouldClose(window)) {
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true); glfwSetWindowShouldClose(window, true);
glBindBuffer(GL_ARRAY_BUFFER, triangle_vertex_buffer);
glVertexAttribPointer(vertex_color_attrib_position,
3,
GL_FLOAT,
GL_FALSE,
(sizeof (float)) * 6,
(void*)0
);
glVertexAttribPointer(vertex_color_attrib_color,
3,
GL_FLOAT,
GL_FALSE,
(sizeof (float)) * 6,
(void*)(3 * 4)
);
glEnableVertexAttribArray(vertex_color_attrib_position);
glEnableVertexAttribArray(vertex_color_attrib_color);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
} }
glfwTerminate(); glfwTerminate();

View File

@ -1,58 +1,62 @@
unsigned int compile_shader(const char * vp_path, const char * fp_path) #include <stddef.h>
#include <stdio.h>
#include "glad/glad.h"
unsigned int compile_shader(const void * vp,
const int vp_length,
const void * fp,
const int fp_length)
{ {
void * vertexShaderSource = read_file(vp_path); unsigned int vertex_shader;
unsigned int vertexShader; vertex_shader = glCreateShader(GL_VERTEX_SHADER);
vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex_shader, 1, (const char **)&vp, &vp_length);
glShaderSource(vertexShader, 1, (const char **)&vertexShaderSource, NULL); glCompileShader(vertex_shader);
glCompileShader(vertexShader);
{ {
int success; int success;
char infoLog[512]; char info_log[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if(!success) { if(!success) {
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
printf("vertex shader compile failed:\n%s\n", infoLog); fprintf(stderr, "vertex shader compile failed:\n%s\n", info_log);
} }
} }
free(vertexShaderSource);
void * fragmentShaderSource = read_file(fp_path); unsigned int fragment_shader;
unsigned int fragmentShader; fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment_shader, 1, (const char **)&fp, &fp_length);
glShaderSource(fragmentShader, 1, (const char **)&fragmentShaderSource, NULL); glCompileShader(fragment_shader);
glCompileShader(fragmentShader);
{ {
int success; int success;
char infoLog[512]; char info_log[512];
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if(!success) { if(!success) {
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
printf("fragment shader compile failed:\n%s\n", infoLog); fprintf(stderr, "fragment shader compile failed:\n%s\n", info_log);
} }
} }
free(fragmentShaderSource);
unsigned int shaderProgram; unsigned int shader_program;
shaderProgram = glCreateProgram(); shader_program = glCreateProgram();
glAttachShader(shaderProgram, vertexShader); glAttachShader(shader_program, vertex_shader);
glAttachShader(shaderProgram, fragmentShader); glAttachShader(shader_program, fragment_shader);
glLinkProgram(shaderProgram); glLinkProgram(shader_program);
{ {
int success; int success;
char infoLog[512]; char info_log[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
if(!success) { if(!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); glGetProgramInfoLog(shader_program, 512, NULL, info_log);
printf("program link failed:\n%s\n", infoLog); fprintf(stderr, "program link failed:\n%s\n", info_log);
} }
} }
glDeleteShader(vertexShader); glDeleteShader(vertex_shader);
glDeleteShader(fragmentShader); glDeleteShader(fragment_shader);
return shaderProgram; return shader_program;
} }
int make_buffer(unsigned int target, int make_buffer(unsigned int target,

8
src/opengl.h Normal file
View File

@ -0,0 +1,8 @@
unsigned int compile_shader(const void * vp,
const size_t vp_length,
const void * fp,
const size_t fp_length);
int make_buffer(unsigned int target,
const void * data,
size_t size);