1
1
module glfw;
2
2
3
+ macro import cx.macros.assert;
3
4
macro import cx.macros.cimport;
4
5
5
6
import c_header("GL/gl.h");
6
7
import c_header("GL/glext.h", "-include GL/gl.h -DGL_GLEXT_PROTOTYPES");
7
8
import c_header("GLFW/glfw3.h");
9
+ import c_header("SOIL.h");
8
10
import std.math;
9
11
import std.string : toStringz;
10
12
11
- extern(C) void assert(bool);
12
-
13
13
struct Vertex {
14
14
float x, y;
15
- float r, g, b ;
15
+ float u, v ;
16
16
}
17
17
18
18
Vertex[] vertices() {
19
19
return [
20
- Vertex(-0.6, -0.4, 1, 0, 0 ),
21
- Vertex(0.6, -0.4, 0, 1 , 0),
22
- Vertex(0, 0.6, 0 , 0, 1)];
20
+ Vertex(-0.6, -0.4, 1, 0),
21
+ Vertex( 0.6, -0.4, 0, 0),
22
+ Vertex( 0, 0.6, 0, 1)];
23
23
}
24
24
25
25
string vertexShader() {
26
26
return "#version 110
27
27
uniform mat4 MVP;
28
- attribute vec3 vCol;
29
28
attribute vec2 vPos;
30
- varying vec3 color;
29
+ attribute vec2 vTexPos;
30
+ varying vec2 texCoord;
31
31
void main()
32
32
{
33
33
gl_Position = MVP * vec4(vPos, 0.0, 1.0);
34
- color = vCol ;
34
+ texCoord = vTexPos ;
35
35
};";
36
36
}
37
37
38
38
string fragmentShader() {
39
39
return "#version 110
40
- varying vec3 color;
40
+ varying vec2 texCoord;
41
+ uniform sampler2D tex;
41
42
void main()
42
43
{
43
- gl_FragColor = vec4(color, 1.0 );
44
+ gl_FragColor = texture2D(tex, texCoord );
44
45
}";
45
46
}
46
47
@@ -139,17 +140,13 @@ mat4x4 mat4x4_ortho(float left, float right, float bottom, float top, float near
139
140
}
140
141
141
142
void main() {
142
- GLuint vertex_shader, fragment_shader, program;
143
-
144
- if (!glfwInit)
145
- return;
143
+ if (!glfwInit) return;
146
144
147
145
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
148
146
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
149
147
150
148
auto window = glfwCreateWindow(640, 480, "Simple example".toStringz, null, null);
151
- if (!window)
152
- {
149
+ if (!window) {
153
150
glfwTerminate;
154
151
return;
155
152
}
@@ -163,7 +160,7 @@ void main() {
163
160
glGenBuffers(1, &vertex_buffer);
164
161
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
165
162
auto vertices = vertices;
166
- glBufferData(GL_ARRAY_BUFFER, 20 * 3 /*sizeof(vertices)*/, cast(void*) vertices.ptr, GL_STATIC_DRAW);
163
+ glBufferData(GL_ARRAY_BUFFER, 16 * 3 /*sizeof(vertices)*/, cast(void*) vertices.ptr, GL_STATIC_DRAW);
167
164
168
165
auto vertex_shader = glCreateShader(GL_VERTEX_SHADER);
169
166
char* vertexShaderPtr = vertexShader.toStringz;
@@ -174,6 +171,18 @@ void main() {
174
171
char* fragmentShaderPtr = fragmentShader.toStringz;
175
172
glShaderSource(fragment_shader, 1, &fragmentShaderPtr, null);
176
173
glCompileShader(fragment_shader);
174
+ int isCompiled;
175
+ glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &isCompiled);
176
+ if (!isCompiled) {
177
+ int maxLength = 0;
178
+ glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &maxLength);
179
+
180
+ auto errorLog = new string(maxLength);
181
+ glGetShaderInfoLog(fragment_shader, maxLength, &maxLength, errorLog.ptr);
182
+
183
+ print(errorLog);
184
+ return;
185
+ }
177
186
178
187
auto program = glCreateProgram;
179
188
glAttachShader(program, vertex_shader);
@@ -182,14 +191,19 @@ void main() {
182
191
183
192
auto mvp_location = glGetUniformLocation(program, "MVP".toStringz);
184
193
auto vpos_location = glGetAttribLocation(program, "vPos".toStringz);
185
- auto vcol_location = glGetAttribLocation(program, "vCol".toStringz);
194
+ auto vtexpos_location = glGetAttribLocation(program, "vTexPos".toStringz);
195
+
196
+ auto tex = SOIL_load_OGL_texture("some_grass_or_we.png".toStringz,
197
+ SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS + SOIL_FLAG_INVERT_Y +
198
+ SOIL_FLAG_NTSC_SAFE_RGB + SOIL_FLAG_COMPRESS_TO_DXT);
199
+ assert(tex != 0);
186
200
187
201
glEnableVertexAttribArray(vpos_location);
188
202
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, false,
189
- /*sizeof(vertices[0] )*/20 , null);
190
- glEnableVertexAttribArray(vcol_location );
191
- glVertexAttribPointer(vcol_location, 3 , GL_FLOAT, false,
192
- /*sizeof(vertices[0] )*/20 , cast(void*) (/*sizeof(float)*/4 * 2));
203
+ /*sizeof(Vertex )*/16 , null);
204
+ glEnableVertexAttribArray(vtexpos_location );
205
+ glVertexAttribPointer(vtexpos_location, 2 , GL_FLOAT, false,
206
+ /*sizeof(Vertex )*/16 , cast(void*) (/*sizeof(float)*/4 * 2));
193
207
194
208
while (!glfwWindowShouldClose(window)) {
195
209
int width, height;
@@ -205,6 +219,9 @@ void main() {
205
219
206
220
glUseProgram(program);
207
221
glUniformMatrix4fv(mvp_location, 1, false, cast(GLfloat*) &mvp);
222
+
223
+ glBindTexture(GL_TEXTURE_2D, tex);
224
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
208
225
glDrawArrays(GL_TRIANGLES, 0, 3);
209
226
210
227
glfwSwapBuffers(window);
0 commit comments