forked from mario-deluna/php-glfw
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.php
141 lines (105 loc) · 2.88 KB
/
test.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
glfwInit();
echo glfwGetVersionString() . PHP_EOL;
// configure the window
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
// // offscreen
// glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// fix for macOs
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// create the window
if (!$window = glfwCreateWindow(1000, 1000, "PHP GLFW Demo")) {
die('Could not create window.');
}
// setup the window
glfwMakeContextCurrent($window);
glfwSwapInterval(1);
// setup the shaders
// Vertext shader
$vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource($vertexShader, 1, "
#version 330 core
layout (location = 0) in vec3 aPos;
out vec3 ourColor;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0f);
ourColor = aPos;
}
");
glCompileShader($vertexShader);
glGetShaderiv($vertexShader, GL_COMPILE_STATUS, $success);
if (!$success) {
die("Vertex shader could not be compiled.");
}
// fragment shaders
$fragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource($fragShader, 1, "
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
uniform float time;
void main()
{
FragColor = vec4(ourColor.x + sin(time / 10), ourColor.y + sin(time / 15), ourColor.z + cos(time / 5), 1.0f);
}
");
glCompileShader($fragShader);
glGetShaderiv($fragShader, GL_COMPILE_STATUS, $success);
if (!$success) {
die("Fragment shader could not be compiled.");
}
// link the shaders
$shaderProgram = glCreateProgram();
glAttachShader($shaderProgram, $vertexShader);
glAttachShader($shaderProgram, $fragShader);
glLinkProgram($shaderProgram);
glGetProgramiv($shaderProgram, GL_LINK_STATUS, $linkSuccess);
// if (!$linkSuccess) {
// die("Shader program could not be linked.");
// }
// free the shders
glDeleteShader($vertexShader);
glDeleteShader($fragShader);
// Buffers
$VBO; $VAO;
// verticies
$verticies = [
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0
];
glGenVertexArrays(1, $VAO);
glGenBuffers(1, $VBO);
glBindVertexArray($VAO);
glBindBuffer(GL_ARRAY_BUFFER, $VBO);
glBufferDataFloat(GL_ARRAY_BUFFER, $verticies, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3, 0);
glEnableVertexAttribArray(0);
// unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
$i = 0;
while (!glfwWindowShouldClose($window))
{
$i++;
glClearColor(sin($i / 200), sin($i / 100), sin($i / 500), 1.0);
//glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
// shader
glUseProgram($shaderProgram);
// set the time
glUniform1f(glGetUniformLocation($shaderProgram, "time"), glfwGetTime());
glBindVertexArray($VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
// swap
glfwSwapBuffers($window);
glfwPollEvents();
}
glDeleteVertexArrays(1, $VAO);
glDeleteBuffers(1, $VBO);
glfwDestroyWindow($window);
glfwTerminate();