Implement shaders #1
@ -26,7 +26,7 @@ enum {
|
||||
|
||||
internal M4x4f get_projection_matrix(ProjectionType projection_type);
|
||||
internal V3f main_shader_vertex(const V3f *vertex, M4x4f *model_view,
|
||||
M4x4f *projection, const Render *render);
|
||||
M4x4f *projection, const Image *img);
|
||||
|
||||
int main(void) {
|
||||
Arena *arena = NULL;
|
||||
@ -82,12 +82,11 @@ internal M4x4f get_projection_matrix(ProjectionType projection_type) {
|
||||
}
|
||||
|
||||
internal V3f main_shader_vertex(const V3f *vertex, M4x4f *model_view,
|
||||
M4x4f *projection, const Render *render) {
|
||||
M4x4f *projection, const Image *img) {
|
||||
V4f vh = {.x = vertex->x, .y = vertex->y, .z = vertex->z, .w = 1.0f};
|
||||
vh = mat4x4_mul_vec4((*projection), mat4x4_mul_vec4((*model_view), vh));
|
||||
vh.y = 0.0 - vh.y;
|
||||
vh = mat4x4_mul_vec4(
|
||||
viewport(vh.x, vh.y, render->img.width, render->img.height), vh);
|
||||
vh = mat4x4_mul_vec4(viewport(vh.x, vh.y, img->width, img->height), vh);
|
||||
|
||||
return project_vec4(vh);
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ internal void render_triangle(const Triangle *triangle, const Model *model,
|
||||
|
||||
for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) {
|
||||
vertices[i] = shader->vertex(&vertices[i], shader->model_view,
|
||||
shader->projection, render);
|
||||
shader->projection, &render->img);
|
||||
}
|
||||
|
||||
if (render_type == RENDER_TYPE_WIREFRAME) {
|
||||
|
14
src/obj.h
14
src/obj.h
@ -4,8 +4,8 @@
|
||||
#include "aliases.h"
|
||||
#include "img.h"
|
||||
#include "mem_arena.h"
|
||||
#include "shader.h"
|
||||
#include "typed_list.h"
|
||||
#include "vec.h"
|
||||
|
||||
#define INVALID_MODEL ((Model){0})
|
||||
#define IS_INVALID_MODEL(m) (m.vertices == NULL || m.triangles == NULL)
|
||||
@ -55,18 +55,6 @@ struct render {
|
||||
Depth depth;
|
||||
};
|
||||
|
||||
typedef V3f(VertexShader)(const V3f *vertex, M4x4f *model_view,
|
||||
M4x4f *projection, const Render *render);
|
||||
typedef bool(FragmentShader)(Colour colour);
|
||||
|
||||
typedef struct shader Shader;
|
||||
struct shader {
|
||||
VertexShader *vertex;
|
||||
FragmentShader *fragment;
|
||||
M4x4f *model_view;
|
||||
M4x4f *projection;
|
||||
};
|
||||
|
||||
Model load_obj_file(Arena *arena, const char *filename, const char *texture);
|
||||
bool init_render(Arena *arena, Render *render, u64 width, u64 height);
|
||||
void render_model(const Model *model, Render *render, const Shader *shader,
|
||||
|
19
src/shader.h
Normal file
19
src/shader.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef SHADER_H
|
||||
#define SHADER_H
|
||||
|
||||
#include "img.h"
|
||||
#include "vec.h"
|
||||
|
||||
typedef V3f(VertexShader)(const V3f *vertex, M4x4f *model_view,
|
||||
M4x4f *projection, const Image *img);
|
||||
typedef bool(FragmentShader)(Colour colour);
|
||||
|
||||
typedef struct shader Shader;
|
||||
struct shader {
|
||||
VertexShader *vertex;
|
||||
FragmentShader *fragment;
|
||||
M4x4f *model_view;
|
||||
M4x4f *projection;
|
||||
};
|
||||
|
||||
#endif // SHADER_H
|
Loading…
Reference in New Issue
Block a user