Pārlūkot izejas kodu

geometry shader support

leonsal 8 gadi atpakaļ
vecāks
revīzija
5696885b93
1 mainītis faili ar 20 papildinājumiem un 2 dzēšanām
  1. 20 2
      renderer/shaman.go

+ 20 - 2
renderer/shaman.go

@@ -229,7 +229,7 @@ func (sm *Shaman) GenProgram(specs *ShaderSpecs) (*gls.Program, error) {
 	// Get vertex shader compiled template
 	vtempl, ok := sm.shaders[progInfo.Vertex]
 	if !ok {
-		return nil, fmt.Errorf("Shader:%s template not found", progInfo.Vertex)
+		return nil, fmt.Errorf("Vertex shader:%s template not found", progInfo.Vertex)
 	}
 	// Generates vertex shader source from template
 	var sourceVertex bytes.Buffer
@@ -241,7 +241,7 @@ func (sm *Shaman) GenProgram(specs *ShaderSpecs) (*gls.Program, error) {
 	// Get fragment shader compiled template
 	fragTempl, ok := sm.shaders[progInfo.Frag]
 	if !ok {
-		return nil, fmt.Errorf("Shader:%s template not found", progInfo.Frag)
+		return nil, fmt.Errorf("Fragment shader:%s template not found", progInfo.Frag)
 	}
 	// Generates fragment shader source from template
 	var sourceFrag bytes.Buffer
@@ -250,10 +250,28 @@ func (sm *Shaman) GenProgram(specs *ShaderSpecs) (*gls.Program, error) {
 		return nil, err
 	}
 
+	// Checks for optional geometry shader compiled template
+	var sourceGeom bytes.Buffer
+	if progInfo.Geometry != "" {
+		// Get geometry shader compiled template
+		geomTempl, ok := sm.shaders[progInfo.Geometry]
+		if !ok {
+			return nil, fmt.Errorf("Geometry shader:%s template not found", progInfo.Geometry)
+		}
+		// Generates geometry shader source from template
+		err = geomTempl.Execute(&sourceGeom, specs)
+		if err != nil {
+			return nil, err
+		}
+	}
+
 	// Creates shader program
 	prog := sm.gs.NewProgram()
 	prog.AddShader(gls.VERTEX_SHADER, sourceVertex.String(), nil)
 	prog.AddShader(gls.FRAGMENT_SHADER, sourceFrag.String(), nil)
+	if progInfo.Geometry != "" {
+		prog.AddShader(gls.GEOMETRY_SHADER, sourceGeom.String(), nil)
+	}
 	err = prog.Build()
 	if err != nil {
 		return nil, err