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 = \
src/main.o \
src/glad.o \
src/opengl.o \
$(patsubst %.glsl,%.glsl.o,$(wildcard src/shader/*.glsl)) \
$(GLFW)

View File

@ -7,9 +7,13 @@
#include "shader/vertex_color.fp.glsl.h"
#include "shader/vertex_color.vp.glsl.h"
#include "opengl.h"
static int vp_width = 800;
static int vp_height = 600;
typedef unsigned int uint;
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
@ -59,16 +63,17 @@ int main()
// buffer initialization
//////////////////////////////////////////////////////////////////////
/*
unsigned int triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER,
triangle_vertex_buffer_data,
(sizeof (triangle_vertex_buffer_data)));
*/
uint triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER,
triangle_vertex_buffer_data,
(sizeof (triangle_vertex_buffer_data)));
/*
vertex_color.program = compile_shaders("src/vertex_color.vp.glsl",
"src/vertex_color_fp_render.fp.glsl");
*/
uint vertex_color_program = compile_shader(src_shader_vertex_color_vp_glsl_start,
src_shader_vertex_color_vp_glsl_size,
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
@ -82,6 +87,29 @@ int main()
while(!glfwWindowShouldClose(window)) {
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
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();

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 vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const char **)&vertexShaderSource, NULL);
glCompileShader(vertexShader);
unsigned int vertex_shader;
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, (const char **)&vp, &vp_length);
glCompileShader(vertex_shader);
{
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
char info_log[512];
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if(!success) {
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
printf("vertex shader compile failed:\n%s\n", infoLog);
}
}
free(vertexShaderSource);
void * fragmentShaderSource = read_file(fp_path);
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, (const char **)&fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
{
int success;
char infoLog[512];
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if(!success) {
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
printf("fragment shader compile failed:\n%s\n", infoLog);
}
}
free(fragmentShaderSource);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
{
int success;
char infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
printf("program link failed:\n%s\n", infoLog);
glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
fprintf(stderr, "vertex shader compile failed:\n%s\n", info_log);
}
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
unsigned int fragment_shader;
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, (const char **)&fp, &fp_length);
glCompileShader(fragment_shader);
{
int success;
char info_log[512];
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if(!success) {
glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
fprintf(stderr, "fragment shader compile failed:\n%s\n", info_log);
}
}
return shaderProgram;
unsigned int shader_program;
shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
{
int success;
char info_log[512];
glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(shader_program, 512, NULL, info_log);
fprintf(stderr, "program link failed:\n%s\n", info_log);
}
}
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
return shader_program;
}
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);