commit 945bde8fa5846fd1a03ad201dfb53d04a41387d2
parent 035d49ecfa6e82c604b05af5f2e2496e35d10245
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 18 Nov 2024 10:33:18 +0900
fixing bug
Diffstat:
2 files changed, 52 insertions(+), 23 deletions(-)
diff --git a/cmd/sample/fragment.glsl b/cmd/sample/fragment.glsl
@@ -14,7 +14,7 @@ struct Light {
vec3 specular;
float Kc, Kl, Kq;
- float cutOff;
+ float cutOff, outerCutOff;
};
in vec3 fnormal;
@@ -35,7 +35,7 @@ void main() {
vec3 viewDir, specular;
vec3 reflectDir;
float diff, spec, dist, attenuation;
- float theta;
+ float epsilon, theta, intensity;
fcol = vec4(0, 0, 0, 1);
diffuse = vec3(0, 0, 0);
@@ -48,15 +48,15 @@ void main() {
lightDir = normalize(light.pos - fpos);
theta = dot(lightDir, normalize(-light.dir));
- if (theta > light.cutOff) {
- diff = max(dot(fnormal, lightDir), 0.0);
- diffuse = diff * vec3(texture(material.diffuse, texPos)) * light.diffuse;
-
- viewDir = normalize(camPos - fpos);
- reflectDir = reflect(-lightDir, fnormal);
- spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shiness);
- specular = vec3(texture(material.specular, texPos)) * spec * light.specular;
- }
+ epsilon = light.cutOff - light.outerCutOff;
+ intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0);
+ diff = max(dot(fnormal, lightDir), 0.0);
+ diffuse = diff * vec3(texture(material.diffuse, texPos)) * light.diffuse * intensity;
+
+ viewDir = normalize(camPos - fpos);
+ reflectDir = reflect(-lightDir, fnormal);
+ spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shiness);
+ specular = vec3(texture(material.specular, texPos)) * spec * light.specular * intensity;
fcol += vec4(ambient + diffuse + specular, 0) * attenuation;
diff --git a/cmd/sample/main.go b/cmd/sample/main.go
@@ -120,7 +120,6 @@ var object = &tofu.Object{
}
var cubePositions = []tofu.Vec3{
- {0, 0, 0},
{4.24, 0.94, -1.94},
{0.79, 2.40, 2.87},
{-0.64, -1.68, 2.79},
@@ -136,20 +135,22 @@ var cubePositions = []tofu.Vec3{
var alpha float32 = 0.2
type App struct {
- program *tofu.Program
- lightProgram *tofu.Program
- cursorChan chan tofu.Cursor
- cur tofu.Cursor
- keyChan chan struct{}
- camera *tofu.Camera
- termination bool
- startedAt time.Time
- texture *tofu.Texture
- specularMap *tofu.Texture
+ program *tofu.Program
+ lightProgram *tofu.Program
+ teapotProgram *tofu.Program
+ cursorChan chan tofu.Cursor
+ cur tofu.Cursor
+ keyChan chan struct{}
+ camera *tofu.Camera
+ termination bool
+ startedAt time.Time
+ texture *tofu.Texture
+ specularMap *tofu.Texture
}
func (app *App) Update() error {
now := float32(time.Since(app.startedAt).Seconds())
+ now = 0
processInput(app)
if app.termination {
return tofu.Termination
@@ -181,7 +182,8 @@ func (app *App) Update() error {
app.program.SetVec3("sun.specular", sunCol)
app.program.SetVec3("light.pos", lightPos)
app.program.SetVec3("light.dir", tofu.Vec3{0, 0, 0}.Sub(lightPos))
- app.program.SetFloat32("light.cutOff", float32(math.Cos(12.5*math.Pi/180)))
+ app.program.SetFloat32("light.cutOff", float32(math.Cos(25*math.Pi/180)))
+ app.program.SetFloat32("light.outerCutOff", float32(math.Cos(35*math.Pi/180)))
app.program.SetVec3("light.ambient", lightCol.MulF(0.1))
app.program.SetVec3("light.diffuse", lightCol.MulF(0.9))
app.program.SetVec3("light.specular", lightCol)
@@ -194,6 +196,28 @@ func (app *App) Update() error {
app.program.SetMat4("model", model)
object.Draw()
}
+ app.teapotProgram.Use()
+ app.teapotProgram.SetMat4("view", view)
+ app.teapotProgram.SetMat4("projection", projection)
+ app.teapotProgram.SetMat4("model", tofu.Translate(tofu.Vec3{0, 0, 0}).Mul(tofu.Scale(0.3)))
+ app.teapotProgram.SetVec3("camPos", camera.Pos)
+ app.teapotProgram.SetVec3("material.diffuse", tofu.Vec3{0.3, 0.4, 0.4})
+ app.teapotProgram.SetVec3("material.specular", tofu.Vec3{0.3, 0.4, 0.4})
+ app.teapotProgram.SetFloat32("material.shiness", 0)
+ app.teapotProgram.SetVec3("sun.dir", sunDir)
+ app.teapotProgram.SetVec3("sun.ambient", sunCol.MulF(0.5))
+ app.teapotProgram.SetVec3("sun.diffuse", sunCol.MulF(0.3))
+ app.teapotProgram.SetVec3("sun.specular", sunCol)
+ app.teapotProgram.SetVec3("light.pos", lightPos)
+ app.teapotProgram.SetVec3("light.dir", tofu.Vec3{0, 0, 0}.Sub(lightPos))
+ app.teapotProgram.SetFloat32("light.outerCutOff", float32(math.Cos(35*math.Pi/180)))
+ app.teapotProgram.SetFloat32("light.cutOff", float32(math.Cos(25*math.Pi/180)))
+ app.teapotProgram.SetVec3("light.ambient", lightCol.MulF(0.4))
+ app.teapotProgram.SetVec3("light.diffuse", lightCol.MulF(0.9))
+ app.teapotProgram.SetVec3("light.specular", lightCol)
+ app.teapotProgram.SetFloat32("light.Kc", 1.0)
+ app.teapotProgram.SetFloat32("light.Kl", 0.0009)
+ app.teapotProgram.SetFloat32("light.Kq", 0.00032)
teapot.Draw()
app.lightProgram.Use()
@@ -232,6 +256,7 @@ func main() {
texturePath := filepath.Join(filepath.Dir(f), "container2.png")
specularMapPath := filepath.Join(filepath.Dir(f), "container2_specular.png")
teapotPath := filepath.Join(filepath.Dir(f), "teapot.obj")
+ teapotFpath := filepath.Join(filepath.Dir(f), "teapot.glsl")
tf, err := os.Open(teapotPath)
if err != nil {
@@ -252,6 +277,10 @@ func main() {
if err != nil {
log.Fatalf("create light shader program: %v", err)
}
+ app.teapotProgram, err = tofu.NewProgram(vpath, teapotFpath)
+ if err != nil {
+ log.Fatalf("create teapot shader program: %v", err)
+ }
app.texture, err = tofu.NewTexture(texturePath)
if err != nil {
log.Fatalf("NewTesture: %v", err)