Skip to content

Commit 44eede6

Browse files
committed
opengl textures
1 parent 8e06c28 commit 44eede6

File tree

6 files changed

+106
-11
lines changed

6 files changed

+106
-11
lines changed

gogl/gogl.go

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,84 @@ import (
44
"errors"
55
"fmt"
66
"github.com/go-gl/gl/v3.3-core/gl"
7+
"github.com/go-gl/mathgl/mgl32"
8+
"image/png"
79
"io/ioutil"
10+
"os"
811
"strings"
912
)
1013

1114
type ShaderID uint32
1215
type ProgramID uint32
1316
type BufferID uint32
17+
type TextureID uint32
18+
19+
func MglTest() {
20+
x := mgl32.NewVecN(2)
21+
fmt.Println(x)
22+
}
1423

1524
func GetVersion() string {
1625
return gl.GoStr(gl.GetString(gl.VERSION))
1726
}
1827

28+
// Todo: SDL2_image stb_image Sean Barret
29+
func LoadTextureAlpha(filename string) TextureID {
30+
infile, err := os.Open(filename)
31+
if err != nil {
32+
panic(err)
33+
}
34+
defer infile.Close()
35+
36+
img, err := png.Decode(infile)
37+
if err != nil {
38+
panic(err)
39+
}
40+
41+
w := img.Bounds().Max.X
42+
h := img.Bounds().Max.Y
43+
44+
pixels := make([]byte, w*h*4)
45+
bIndex := 0
46+
for y := 0; y < h; y++ {
47+
for x := 0; x < w; x++ {
48+
r, g, b, a := img.At(x, y).RGBA()
49+
pixels[bIndex] = byte(r / 256)
50+
bIndex++
51+
pixels[bIndex] = byte(g / 256)
52+
bIndex++
53+
pixels[bIndex] = byte(b / 256)
54+
bIndex++
55+
pixels[bIndex] = byte(a / 256)
56+
bIndex++
57+
}
58+
}
59+
60+
texture := GenBindTexture()
61+
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT)
62+
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT)
63+
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
64+
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
65+
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, int32(w), int32(h), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(pixels))
66+
gl.GenerateMipmap(gl.TEXTURE_2D)
67+
return texture
68+
}
69+
70+
func GenBindTexture() TextureID {
71+
var texId uint32
72+
gl.GenTextures(1, &texId)
73+
gl.BindTexture(gl.TEXTURE_2D, texId)
74+
return TextureID(texId)
75+
}
76+
77+
func BindTexture(id TextureID) {
78+
gl.BindTexture(gl.TEXTURE_2D, uint32(id))
79+
}
80+
1981
func LoadShader(path string, shaderType uint32) (ShaderID, error) {
2082
shaderFile, err := ioutil.ReadFile(path)
2183
if err != nil {
22-
panic(err)
84+
return 0, err
2385
}
2486
shaderFileStr := string(shaderFile)
2587
shaderId, err := CreateShader(shaderFileStr, shaderType)

gogl/shader.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@ func NewShader(vertexPath string, fragmentPath string) (*Shader, error) {
2020
if err != nil {
2121
return nil, err
2222
}
23-
result := &Shader{id, vertexPath, fragmentPath, getModifiedTime(vertexPath), getModifiedTime(fragmentPath)}
23+
vertexModTime, err := getModifiedTime(vertexPath)
24+
if err != nil {
25+
return nil, err
26+
}
27+
fragmentModTime, err := getModifiedTime(fragmentPath)
28+
if err != nil {
29+
return nil, err
30+
}
31+
result := &Shader{id, vertexPath, fragmentPath, vertexModTime, fragmentModTime}
2432
return result, nil
2533
}
2634

@@ -34,18 +42,25 @@ func (shader *Shader) SetFloat(name string, f float32) {
3442
gl.Uniform1f(location, f)
3543
}
3644

37-
func getModifiedTime(filePath string) time.Time {
45+
func getModifiedTime(filePath string) (time.Time, error) {
46+
3847
file, err := os.Stat(filePath)
3948
if err != nil {
40-
panic(err)
49+
return time.Time{}, err
4150
}
42-
return file.ModTime()
51+
return file.ModTime(), nil
4352
}
4453

45-
func (shader *Shader) CheckShaderForChanges() {
54+
func (shader *Shader) CheckShaderForChanges() error {
4655

47-
vertexModTime := getModifiedTime(shader.vertexPath)
48-
fragmentModTime := getModifiedTime(shader.fragmentPath)
56+
vertexModTime, err := getModifiedTime(shader.vertexPath)
57+
if err != nil {
58+
return err
59+
}
60+
fragmentModTime, err := getModifiedTime(shader.fragmentPath)
61+
if err != nil {
62+
return err
63+
}
4964
// check if greater than?
5065
if !vertexModTime.Equal(shader.vertexModified) ||
5166
!fragmentModTime.Equal(shader.fragmentModified) {
@@ -57,5 +72,6 @@ func (shader *Shader) CheckShaderForChanges() {
5772
shader.id = id
5873
}
5974
}
75+
return nil
6076

6177
}

hellotriangle/assets/tex.png

930 KB
Loading

hellotriangle/hellotriangle.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// Make shader hotloading fail gracefully and retry
2+
// Make an attribpointer helper function
3+
// Make a texture
4+
15
package main
26

37
import (
@@ -29,14 +33,17 @@ func main() {
2933
defer window.Destroy()
3034

3135
gl.Init()
36+
gogl.MglTest()
3237

3338
fmt.Println("OpenGL Version", gogl.GetVersion())
3439

35-
shaderProgram, err := gogl.NewShader("shaders/hello.vert", "shaders/hello.frag")
40+
shaderProgram, err := gogl.NewShader("shaders/hello.vert", "shaders/quadtexture.frag")
3641
if err != nil {
3742
panic(err)
3843
}
3944

45+
texture := gogl.LoadTextureAlpha("assets/tex.png")
46+
4047
vertices := []float32{
4148
0.5, 0.5, 0.0, 1.0, 1.0,
4249
0.5, -0.5, 0.0, 1.0, 0.0,
@@ -74,6 +81,7 @@ func main() {
7481
shaderProgram.Use()
7582
shaderProgram.SetFloat("x", x)
7683
shaderProgram.SetFloat("y", 0.0)
84+
gogl.BindTexture(texture)
7785
gogl.BindVertexArray(VAO)
7886
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, gl.PtrOffset(0))
7987
window.GLSwap()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#version 330 core
2+
out vec4 FragColor;
3+
in vec2 TexCoord;
4+
5+
uniform sampler2D texture1;
6+
7+
void main() {
8+
FragColor = texture(texture1,TexCoord);
9+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ void main()
155155
vec2 star2pos = coord + pos *.05;
156156
vec2 star3pos = coord + pos *.1;
157157

158-
vec3 nebulaColor1 = hsv2rgb(vec3(.4+.005*sin(nebula1pos.x * 100.0 + nebula1pos.y), 0.5, .25));
159-
vec3 nebulaColor2 = hsv2rgb(vec3(.9+.001*sin(nebula2pos.x * 60.0 + nebula2pos.y), 1., .25));
158+
vec3 nebulaColor1 = hsv2rgb(vec3(.9+.005*sin(nebula1pos.x * 100.0 + nebula1pos.y), 0.5, .25));
159+
vec3 nebulaColor2 = hsv2rgb(vec3(.1+.001*sin(nebula2pos.x * 60.0 + nebula2pos.y), 1., .25));
160160

161161
result += fractalNebula(nebula1pos, nebulaColor1, 1.);
162162
result += fractalNebula(nebula2pos + vec2(5., 7.2), nebulaColor2, .5);

0 commit comments

Comments
 (0)