fix(render): 修复白屏/黑屏——视图矩阵、UI着色器、网格构建性能与安装目录
- 相机视图矩阵按 R_cam^T·T(-pos) 正确推导(旧布局非正交,非零视角下场景塌缩为灰屏) - UI 片元着色器改为纹理×颜色(旧实现丢弃纹理 RGB,彩色纹理全白) - UI 纹理与图集 mipmap:图集补齐 2 次幂、UI 上传不生成 mipmap(NPOT 不完整纹理采样纯白) - 网格构建持一次读锁(旧实现每格邻居查询各加锁约 40 万次/区块,出生区块迟迟无网格, 玩家透过脚下的洞看到地下横截面——进游戏黑屏主因);脏区块按距离排序优先构建 - 开启背面剔除(CW 正面):区块边界面向未加载邻居的内侧面不再以暗色出现在视野里 - 出生逻辑:等区块加载后定位地表出生,相机略微俯视 - dev 截图测试:-shot 等待玩家所在 5×5 区块网格就绪再拍(48s 兜底),先测试后打包 - 安装器改为按用户安装到 LOCALAPPDATA(Program Files 无写权限导致启动即崩) - dev 截图工具独立成 devshot_gl.go
This commit is contained in:
@@ -32,26 +32,27 @@ func (c *Camera) Right() [3]float64 {
|
||||
}
|
||||
|
||||
// View 视图矩阵(列主序 4×4,GL 用)。
|
||||
// 推导:相机旋转 R_cam = RotY(yaw)·RotX(pitch);视图 = R_camᵀ·T(-pos)。
|
||||
// 旧实现矩阵布局错误导致非零视角下画面全灰(白屏/灰屏根因之一)。
|
||||
func (c *Camera) View() [16]float32 {
|
||||
// 旋转 = RotX(-pitch) × RotY(-yaw),再平移 -pos
|
||||
cp, sp := math.Cos(-c.Pitch), math.Sin(-c.Pitch)
|
||||
cy, sy := math.Cos(-c.Yaw), math.Sin(-c.Yaw)
|
||||
cp, sp := math.Cos(c.Pitch), math.Sin(c.Pitch)
|
||||
cy, sy := math.Cos(c.Yaw), math.Sin(c.Yaw)
|
||||
|
||||
// R = RotY(-yaw) × RotX(-pitch) 的计算结果(行主序推导后转列主序)
|
||||
// 列主序布局: m[col*4+row]
|
||||
m := [16]float32{}
|
||||
var m [16]float32
|
||||
// 列 0
|
||||
m[0] = float32(cy)
|
||||
m[1] = float32(-sy * sp)
|
||||
m[2] = float32(-sy * cp)
|
||||
m[4] = float32(sy)
|
||||
m[5] = float32(cy * sp)
|
||||
m[6] = float32(cy * cp)
|
||||
m[8] = 0
|
||||
m[9] = float32(cp)
|
||||
m[10] = float32(-sp)
|
||||
m[1] = 0
|
||||
m[2] = float32(sy)
|
||||
// 列 1
|
||||
m[4] = float32(-sy * sp)
|
||||
m[5] = float32(cp)
|
||||
m[6] = float32(cy * sp)
|
||||
// 列 2
|
||||
m[8] = float32(-sy * cp)
|
||||
m[9] = float32(-sp)
|
||||
m[10] = float32(cy * cp)
|
||||
m[15] = 1
|
||||
|
||||
// 平移部分:t = -R·pos
|
||||
// 平移:t = -R·pos
|
||||
px, py, pz := float32(c.Pos[0]), float32(c.Pos[1]), float32(c.Pos[2])
|
||||
m[12] = -(m[0]*px + m[4]*py + m[8]*pz)
|
||||
m[13] = -(m[1]*px + m[5]*py + m[9]*pz)
|
||||
|
||||
Reference in New Issue
Block a user