Skip to content

Commit adc5218

Browse files
authored
Merge pull request #3669 from Jesuszilla/new-feats2
fix: HDR data alignment, missing enum definitions & uncompiled geo shader on Android; alpha in HDR images on 3D BGs
2 parents 64ec284 + d49a0f8 commit adc5218

8 files changed

Lines changed: 52 additions & 17 deletions

File tree

src/model.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -363,17 +363,17 @@ func loadEnvironment(filepath string) (*Environment, error) {
363363
env.GGXLUT = &GLTFTexture{}
364364
if hdrImg, ok := img.(hdr.Image); ok {
365365
bounds := img.Bounds()
366-
size := bounds.Max.X * bounds.Max.Y * 3
366+
size := bounds.Max.X * bounds.Max.Y * 4
367367
data := make([]float32, 0, size)
368368
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
369369
for x := bounds.Min.X; x < bounds.Max.X; x++ {
370370
color := hdrImg.HDRAt(x, y)
371-
r, g, b, _ := color.HDRRGBA()
372-
data = append(data, float32(r), float32(g), float32(b))
371+
r, g, b, a := color.HDRRGBA()
372+
data = append(data, float32(r), float32(g), float32(b), float32(a))
373373
}
374374
}
375-
for i, j := 0, len(data)-3; i < j; i, j = i+3, j-3 {
376-
data[i], data[i+1], data[i+2], data[j], data[j+1], data[j+2] = data[j], data[j+1], data[j+2], data[i], data[i+1], data[i+2]
375+
for i, j := 0, len(data)-4; i < j; i, j = i+4, j-4 {
376+
data[i], data[i+1], data[i+2], data[i+3], data[j], data[j+1], data[j+2], data[j+3] = data[j], data[j+1], data[j+2], data[j+3], data[i], data[i+1], data[i+2], data[i+3]
377377
}
378378
sys.mainThreadTask <- func() {
379379
if !gfx.IsModelEnabled() {

src/render_gl33.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ func (r *Renderer_GL33) newDataTexture(width, height int32) Texture {
246246
func (r *Renderer_GL33) newHDRTexture(width, height int32) Texture {
247247
r.SetActiveTexture0() //gl.ActiveTexture(gl.TEXTURE0)
248248

249-
t := r.generateTexture(width, height, 96, false)
249+
t := r.generateTexture(width, height, 128, false)
250250

251251
gl.BindTexture(gl.TEXTURE_2D, t.handle)
252252
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
@@ -263,7 +263,7 @@ func (r *Renderer_GL33) newCubeMapTexture(widthHeight int32, mipmap bool, lowest
263263

264264
gl.BindTexture(gl.TEXTURE_CUBE_MAP, t.handle)
265265
for i := 0; i < 6; i++ {
266-
gl.TexImage2D(uint32(gl.TEXTURE_CUBE_MAP_POSITIVE_X+i), 0, gl.RGB32F, widthHeight, widthHeight, 0, gl.RGB, gl.FLOAT, nil)
266+
gl.TexImage2D(uint32(gl.TEXTURE_CUBE_MAP_POSITIVE_X+i), 0, gl.RGBA32F, widthHeight, widthHeight, 0, gl.RGBA, gl.FLOAT, nil)
267267
}
268268

269269
if mipmap {

src/render_gles32.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@ func (r *Renderer_GLES32) newShaderProgram(vert, frag, geo, name string, crashWh
5959
}
6060
Logcat("GLES: Frag Obj created: " + name)
6161

62-
// IMPORTANT: Geometry shaders are very unstable on GLES 3.2 mobile.
63-
// For now, let's force skip them to see if we can reach the main menu.
64-
if false && len(geo) > 0 {
62+
// Activate the shader if it's there
63+
if len(geo) > 0 {
6564
if geoObj, err := r.compileShader(gl.GEOMETRY_SHADER, geo); chkEX(err, "Shader compilation error on "+name+"\n", crashWhenFail) {
6665
return nil, err
6766
} else {
@@ -1169,6 +1168,8 @@ func (r *Renderer_GLES32) MapBlendFunction(i BlendFunc) uint32 {
11691168
BlendZero: gl.ZERO,
11701169
BlendSrcAlpha: gl.SRC_ALPHA,
11711170
BlendOneMinusSrcAlpha: gl.ONE_MINUS_SRC_ALPHA,
1171+
BlendDstColor: gl.DST_COLOR,
1172+
BlendOneMinusDstColor: gl.ONE_MINUS_DST_COLOR,
11721173
}
11731174
return BlendFunctionLUT[i]
11741175
}
@@ -2219,7 +2220,7 @@ func (r *Renderer_GLES32) RenderLUT(distribution int32, cubeTex Texture, lutTex
22192220
gl.Uniform1i(loc, 1)
22202221

22212222
gl.BindTexture(gl.TEXTURE_2D, lutTexture.handle)
2222-
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, lutTexture.width, lutTexture.height, 0, gl.RGBA, gl.FLOAT, nil)
2223+
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, lutTexture.width, lutTexture.height, 0, gl.RGBA, gl.HALF_FLOAT, nil)
22232224

22242225
gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, lutTexture.handle, 0)
22252226
gl.Clear(gl.COLOR_BUFFER_BIT)

src/render_vk.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,12 @@ func (r *Renderer_VK) newDataTexture(width, height int32) Texture {
106106
return t
107107
}
108108
func (r *Renderer_VK) newHDRTexture(width, height int32) Texture {
109-
t := r.newTexture(width, height, 32*3, true) //float
109+
t := r.newTexture(width, height, 32*4, true) //float
110110
t.(*Texture_VK).sampler = r.GetSampler(VulkanSamplerInfo{TextureSamplingFilterLinear, TextureSamplingFilterLinear, TextureSamplingWrapMirroredRepeat, TextureSamplingWrapMirroredRepeat})
111111
return t
112112
}
113113
func (r *Renderer_VK) newCubeMapTexture(widthHeight int32, mipmap bool, lowestMipLevel int32) Texture {
114-
t := &Texture_VK{widthHeight, widthHeight, 96, false, 1, [2]int32{0, 0}, [4]float32{0, 0, 1, 1}, nil, nil, nil}
114+
t := &Texture_VK{widthHeight, widthHeight, 128, false, 1, [2]int32{0, 0}, [4]float32{0, 0, 1, 1}, nil, nil, nil}
115115
if mipmap {
116116
t.mipLevels = uint32(math.Floor(math.Log2(float64(widthHeight)))+1) - uint32(lowestMipLevel)
117117
t.sampler = r.GetSampler(VulkanSamplerInfo{TextureSamplingFilterLinear, TextureSamplingFilterLinearMipMapLinear, TextureSamplingWrapClampToEdge, TextureSamplingWrapClampToEdge})

src/shaders/shadow.frag.glsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#ifdef GL_ES
2+
precision highp float; // don't ask why but putting these up here satisfies the compiler
3+
precision highp int;
4+
#endif
15
struct Light
26
{
37
vec3 direction;

src/shaders/shadow.geo.glsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#ifdef GL_ES
2+
precision highp float;
3+
precision highp int;
4+
#endif
15
layout(triangle_strip, max_vertices = 18) out;
26
uniform int layerOffset;
37
#define LAYER_OFFSET layerOffset

src/shaders/shadow.vert.glsl

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@
6666
#define COMPAT_TEXTURE texture
6767
#ifdef GL_ES
6868
precision highp float;
69-
#define GS_IN(x) x
69+
precision highp int;
70+
#define GS_IN(x) x##In
7071
#else
7172
#define GS_IN(x) x##In
7273
#endif
@@ -88,9 +89,10 @@
8889
COMPAT_ATTRIBUTE vec4 weights_0;
8990
COMPAT_ATTRIBUTE vec4 weights_1;
9091

91-
COMPAT_VARYING float GS_IN(vColor);
92-
COMPAT_VARYING vec2 GS_IN(texcoord);
93-
COMPAT_VARYING vec4 GS_IN(FragPos);
92+
// GS_IN(name) causes issues on GLES for some reason, just use them as-is
93+
COMPAT_VARYING float vColorIn;
94+
COMPAT_VARYING vec2 texcoordIn;
95+
COMPAT_VARYING vec4 FragPosIn;
9496
#endif
9597

9698

@@ -130,7 +132,11 @@ mat4 getJointMatrix(){
130132
}
131133

132134
void main() {
135+
#ifdef GL_ES
136+
texcoordIn = uv;
137+
#else
133138
GS_IN(texcoord) = uv;
139+
#endif
134140
#if __VERSION__ >= 450
135141
if(useVertColor) {
136142
vColor = vertColor.a;
@@ -139,7 +145,11 @@ void main() {
139145
}
140146
bool skinning = useJoint0;
141147
#else
148+
#ifdef GL_ES
149+
vColorIn = vertColor.a;
150+
#else
142151
GS_IN(vColor) = vertColor.a;
152+
#endif
143153
bool skinning = checkSkinning();
144154
#endif
145155
vec4 pos = vec4(position, 1.0);
@@ -152,15 +162,27 @@ void main() {
152162
if(float(idx) < morphTargetOffset[0]){
153163
pos += morphTargetWeight[idx/4][idx%4] * COMPAT_TEXTURE(morphTargetValues,xy);
154164
}else if(float(idx) >= morphTargetOffset[2] && float(idx) < morphTargetOffset[3]){
165+
#ifdef GL_ES
166+
texcoordIn += morphTargetWeight[idx/4][idx%4] * vec2(COMPAT_TEXTURE(morphTargetValues,xy));
167+
#else
155168
GS_IN(texcoord) += morphTargetWeight[idx/4][idx%4] * vec2(COMPAT_TEXTURE(morphTargetValues,xy));
169+
#endif
156170
}
157171
}
158172
}
159173
if(skinning){
160174
mat4 jointMatrix = getJointMatrix();
175+
#ifdef GL_ES
176+
FragPosIn = model * jointMatrix * pos;
177+
#else
161178
GS_IN(FragPos) = model * jointMatrix * pos;
179+
#endif
162180
}else{
181+
#ifdef GL_ES
182+
FragPosIn = model * pos;
183+
#else
163184
GS_IN(FragPos) = model * pos;
185+
#endif
164186
}
165187
#if __VERSION__ >= 450
166188
gl_Layer = int(layers[gl_InstanceIndex/4][gl_InstanceIndex%4]);
@@ -169,6 +191,10 @@ void main() {
169191
#else
170192
// GLES PATH: Apply the light matrix and set the final gl_Position
171193
// We assume lightIndex is passed as a uniform for GLES
194+
#ifdef GL_ES
195+
gl_Position = lightMatrix * FragPosIn;
196+
#else
172197
gl_Position = lightMatrix * GS_IN(FragPos);
198+
#endif
173199
#endif
174200
}

src/shaders/shadow.vert.spv

20 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)