pixel shader texture sum

This commit is contained in:
Zack Buhman 2025-12-07 16:18:09 -06:00
parent 75d1a0db40
commit dd24f051aa
3 changed files with 81 additions and 24 deletions

View File

@ -53,23 +53,32 @@ int main()
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
const int buf_width = 4;
const int buf_height = 4;
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// textures // textures
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
const char * data = "arst"; const char * data =
"arst"
"qwfp"
"1234"
"6789";
int input_width = 4;
int input_height = 4;
uint texture_input = make_texture(data, uint texture_input = make_texture(data,
GL_R8, // internalformat GL_R8, // internalformat
2, // width input_width,
2, // height input_height,
GL_RED, GL_RED,
GL_UNSIGNED_BYTE); GL_UNSIGNED_BYTE);
uint texture_framebuffer = make_texture(NULL, uint texture_framebuffer = make_texture(NULL,
GL_RGBA32F, GL_RGBA32F,
2, buf_width,
2, buf_height,
GL_RGBA, GL_RGBA,
GL_UNSIGNED_BYTE); GL_UNSIGNED_BYTE);
@ -83,6 +92,8 @@ int main()
src_shader_test_vs_glsl_size, src_shader_test_vs_glsl_size,
src_shader_test_fs_glsl_start, src_shader_test_fs_glsl_start,
src_shader_test_fs_glsl_size); src_shader_test_fs_glsl_size);
uint program_test__tex_sampler = glGetUniformLocation(program_test, "tex_sampler");
uint program_test__tex_size = glGetUniformLocation(program_test, "tex_size");
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// buffers // buffers
@ -111,12 +122,56 @@ int main()
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true); glfwSetWindowShouldClose(window, true);
/* //
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glViewport(0, 0, buf_width, buf_height);
glClearColor(0.78, 0.56, 0.34, 0.12);
glClear(GL_COLOR_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_input);
uint draw_buffers[1] = {GL_COLOR_ATTACHMENT0}; uint draw_buffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, draw_buffers); glDrawBuffers(1, draw_buffers);
glViewport(0, 0, 2, 2); glUseProgram(program_test);
*/ glUniform1i(program_test__tex_sampler, 0);
glUniform4f(program_test__tex_size,
input_width, input_height,
0.5f / input_width,
0.5f / input_height);
glBindVertexArray(vertex_array);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
float out[4 * buf_width * buf_height] = {};
glReadPixels(0, 0,
buf_width, buf_height,
GL_RGBA,
GL_FLOAT,
out);
for (int y = 0; y < buf_height; y++) {
for (int x = 0; x < buf_width; x++) {
printf("[% 2.3f % 2.3f % 2.3f % 2.3f ] ",
out[(y * buf_width + x) * 4 + 0],
out[(y * buf_width + x) * 4 + 1],
out[(y * buf_width + x) * 4 + 2],
out[(y * buf_width + x) * 4 + 3]);
}
printf("\n");
}
int sum = 0;
for (int i = 0; i < buf_width * buf_height; i++) {
printf("%d ", data[i]);
if ((i % 4) == 3)
printf("\n");
sum += data[i];
}
printf("sum: %d\n", sum);
break;
/*
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, vp_width, vp_height); glViewport(0, 0, vp_width, vp_height);
glClearColor(0.1, 0.2, 0.0, 0.4); glClearColor(0.1, 0.2, 0.0, 0.4);
@ -125,24 +180,11 @@ int main()
glUseProgram(program_test); glUseProgram(program_test);
glBindVertexArray(vertex_array); glBindVertexArray(vertex_array);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
*/
//glFlush(); //glFlush();
//glFinish(); //glFinish();
/*
float out[4 * 2 * 2] = {0};
glReadPixels(0, 0,
2, 2,
GL_RGBA,
GL_FLOAT,
out);
for (int i = 0; i < 4 * 2 * 2; i++) {
printf("%f\n", out[i]);
}
*/
//printf("swap\n");
glfwSwapBuffers(window); glfwSwapBuffers(window);
glfwPollEvents(); glfwPollEvents();
} }

View File

@ -2,9 +2,24 @@
out vec4 fragment_color; out vec4 fragment_color;
uniform sampler2D tex_sampler;
uniform vec4 tex_size;
in vec2 f_position; in vec2 f_position;
void main() void main()
{ {
fragment_color = vec4(f_position, 0, 0); vec4 p = texture(tex_sampler, f_position);
float sum = 0;
for (float y = 0; y < tex_size.y; y++) {
for (float x = 0; x < tex_size.x; x++) {
vec2 coord = vec2((x * 2 + 1) * tex_size.z,
(y * 2 + 1) * tex_size.w);
sum += texture(tex_sampler, coord).x * 255;
}
}
fragment_color = vec4(p.x * 255, sum, f_position);
} }

View File

@ -6,7 +6,7 @@ out vec2 f_position;
void main() void main()
{ {
f_position = position; f_position = position * 0.5 + 0.5;
gl_Position = vec4(position, 0, 1); gl_Position = vec4(position, 0, 1);
} }