add texture_dual
This commit is contained in:
parent
48201e65c7
commit
30dd82d098
2
Makefile
2
Makefile
@ -6,6 +6,8 @@ CFLAGS += -Wall -Werror -Wfatal-errors
|
|||||||
CFLAGS += $(shell pkg-config --libs --cflags glfw3)
|
CFLAGS += $(shell pkg-config --libs --cflags glfw3)
|
||||||
CFLAGS += -lm -lGL
|
CFLAGS += -lm -lGL
|
||||||
|
|
||||||
|
all:
|
||||||
|
|
||||||
%: %.c
|
%: %.c
|
||||||
$(CC) $(ARCH) $(CFLAGS) $(LDFLAGS) $(OPT) $< -o $@
|
$(CC) $(ARCH) $(CFLAGS) $(LDFLAGS) $(OPT) $< -o $@
|
||||||
|
|
||||||
|
|||||||
262
src/texture_dual.c
Normal file
262
src/texture_dual.c
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
|
|
||||||
|
static void * read_file(const char * filename)
|
||||||
|
{
|
||||||
|
int fd = open(filename, O_RDONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
fprintf(stderr, "open(%s): %s\n", filename, strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t size = lseek(fd, 0, SEEK_END);
|
||||||
|
if (size == (off_t)-1) {
|
||||||
|
fprintf(stderr, "lseek(%s, SEEK_END): %s\n", filename, strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t start = lseek(fd, 0, SEEK_SET);
|
||||||
|
if (start == (off_t)-1) {
|
||||||
|
fprintf(stderr, "lseek(%s, SEEK_SET): %s\n", filename, strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * buf = malloc(size+1);
|
||||||
|
|
||||||
|
ssize_t read_size = read(fd, buf, size);
|
||||||
|
if (read_size == -1) {
|
||||||
|
fprintf(stderr, "read(%s): %s\n", filename, strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
((char*)buf)[read_size] = 0;
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int compile_shaders()
|
||||||
|
{
|
||||||
|
void * vertexShaderSource = read_file("src/texture_dual.vp.glsl");
|
||||||
|
unsigned int vertexShader;
|
||||||
|
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
glShaderSource(vertexShader, 1, (const char **)&vertexShaderSource, NULL);
|
||||||
|
glCompileShader(vertexShader);
|
||||||
|
{
|
||||||
|
int success;
|
||||||
|
char infoLog[512];
|
||||||
|
glGetShaderiv(vertexShader, 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("src/texture_dual.fp.glsl");
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glDeleteShader(vertexShader);
|
||||||
|
glDeleteShader(fragmentShader);
|
||||||
|
|
||||||
|
return shaderProgram;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int make_buffer(unsigned int target,
|
||||||
|
const void * data,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
unsigned int buffer;
|
||||||
|
glGenBuffers(1, &buffer);
|
||||||
|
glBindBuffer(target, buffer);
|
||||||
|
glBufferData(target, size, data, GL_STATIC_DRAW);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const float vertex_buffer_data[] = {
|
||||||
|
// position // texture
|
||||||
|
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // top right
|
||||||
|
0.5f, -0.5f, 0.0f, 1.0f, 1.0f, // bottom right
|
||||||
|
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // bottom left
|
||||||
|
|
||||||
|
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, // top left
|
||||||
|
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // top right
|
||||||
|
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // bottom left
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct location {
|
||||||
|
struct {
|
||||||
|
unsigned int position;
|
||||||
|
unsigned int texture;
|
||||||
|
} attrib;
|
||||||
|
struct {
|
||||||
|
unsigned int texture1;
|
||||||
|
unsigned int texture2;
|
||||||
|
unsigned int rotate;
|
||||||
|
} uniform;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
glfwInit();
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
|
||||||
|
//glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE);
|
||||||
|
|
||||||
|
GLFWwindow* window = glfwCreateWindow(800, 800, "LearnOpenGL", NULL, NULL);
|
||||||
|
if (window == NULL) {
|
||||||
|
const char* description;
|
||||||
|
glfwGetError(&description);
|
||||||
|
printf("Failed to create GLFW window: %s\n", description);
|
||||||
|
glfwTerminate();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
|
glViewport(0, 0, 800, 800);
|
||||||
|
//glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||||
|
|
||||||
|
unsigned int vertex_buffer = make_buffer(GL_ARRAY_BUFFER,
|
||||||
|
vertex_buffer_data,
|
||||||
|
(sizeof (vertex_buffer_data)));
|
||||||
|
|
||||||
|
printf("compile start\n");
|
||||||
|
unsigned int shaderProgram = compile_shaders();
|
||||||
|
printf("compile end\n");
|
||||||
|
|
||||||
|
struct location location;
|
||||||
|
|
||||||
|
location.attrib.position = glGetAttribLocation(shaderProgram, "pos");
|
||||||
|
location.attrib.texture = glGetAttribLocation(shaderProgram, "tex");
|
||||||
|
printf("attributes:\n position %u\n texture %u\n",
|
||||||
|
location.attrib.position,
|
||||||
|
location.attrib.texture);
|
||||||
|
|
||||||
|
location.uniform.texture1 = glGetUniformLocation(shaderProgram, "texture1");
|
||||||
|
location.uniform.texture2 = glGetUniformLocation(shaderProgram, "texture2");
|
||||||
|
location.uniform.rotate = glGetUniformLocation(shaderProgram, "rotate");
|
||||||
|
printf("uniforms:\n texture1 %u\n texture2 %u\n rotate %u\n",
|
||||||
|
location.uniform.texture1,
|
||||||
|
location.uniform.texture2,
|
||||||
|
location.uniform.rotate);
|
||||||
|
|
||||||
|
unsigned int texture1;
|
||||||
|
glGenTextures(1, &texture1);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture1);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
void * texture_buf1 = read_file("texture/butterfly_1024x1024_argb8888.data");
|
||||||
|
assert(texture_buf1 != NULL);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_buf1);
|
||||||
|
free(texture_buf1);
|
||||||
|
|
||||||
|
unsigned int texture2;
|
||||||
|
glGenTextures(1, &texture2);
|
||||||
|
glActiveTexture(GL_TEXTURE1);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture2);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
void * texture_buf2 = read_file("texture/bird_1024x1024_argb8888.data");
|
||||||
|
assert(texture_buf2 != NULL);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_buf2);
|
||||||
|
free(texture_buf2);
|
||||||
|
|
||||||
|
while(!glfwWindowShouldClose(window)) {
|
||||||
|
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
||||||
|
glfwSetWindowShouldClose(window, true);
|
||||||
|
|
||||||
|
glClearColor(0.1f, 0.1f, 0.1f, 0.1f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
//
|
||||||
|
// render
|
||||||
|
//
|
||||||
|
glUseProgram(shaderProgram);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glVertexAttribPointer(location.attrib.position,
|
||||||
|
3,
|
||||||
|
GL_FLOAT,
|
||||||
|
GL_FALSE,
|
||||||
|
(sizeof (float)) * 5,
|
||||||
|
(void*)0
|
||||||
|
);
|
||||||
|
glVertexAttribPointer(location.attrib.texture,
|
||||||
|
2,
|
||||||
|
GL_FLOAT,
|
||||||
|
GL_FALSE,
|
||||||
|
(sizeof (float)) * 5,
|
||||||
|
(void*)(3 * 4)
|
||||||
|
);
|
||||||
|
glEnableVertexAttribArray(location.attrib.position);
|
||||||
|
glEnableVertexAttribArray(location.attrib.texture);
|
||||||
|
|
||||||
|
glUniform1i(location.uniform.texture1, 0);
|
||||||
|
glUniform1i(location.uniform.texture2, 1);
|
||||||
|
static float rotate = 0;
|
||||||
|
glUniform1f(location.uniform.rotate, rotate);
|
||||||
|
rotate += 0.01f;
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
|
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
15
src/texture_dual.fp.glsl
Normal file
15
src/texture_dual.fp.glsl
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#version 120
|
||||||
|
|
||||||
|
uniform sampler2D texture1;
|
||||||
|
uniform sampler2D texture2;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 c1 = texture2D(texture1, gl_TexCoord[0].xy);
|
||||||
|
|
||||||
|
vec4 c2 = texture2D(texture2, gl_TexCoord[0].xy);
|
||||||
|
|
||||||
|
float i = gl_TexCoord[0].x;
|
||||||
|
|
||||||
|
gl_FragColor = mix(c1, c2, smoothstep(0.15, 0.80, i));
|
||||||
|
}
|
||||||
18
src/texture_dual.vp.glsl
Normal file
18
src/texture_dual.vp.glsl
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#version 120
|
||||||
|
|
||||||
|
attribute vec3 pos;
|
||||||
|
attribute vec2 tex;
|
||||||
|
|
||||||
|
uniform float rotate;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float ct = cos(rotate);
|
||||||
|
float st = sin(rotate);
|
||||||
|
|
||||||
|
float x = pos.x * ct - pos.y * st;
|
||||||
|
float y = pos.x * st + pos.y * ct;
|
||||||
|
|
||||||
|
gl_Position = vec4(x, y, 0, 1);
|
||||||
|
gl_TexCoord[0] = vec4(tex, 0, 0);
|
||||||
|
}
|
||||||
4822
texture/bird_1024x1024_argb8888.data
Normal file
4822
texture/bird_1024x1024_argb8888.data
Normal file
File diff suppressed because one or more lines are too long
15310
texture/butterfly_1024x1024_argb8888.data
Normal file
15310
texture/butterfly_1024x1024_argb8888.data
Normal file
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user