Use float4s to prevent padding

This commit is contained in:
Lubos Lenco 2017-02-07 11:50:21 +01:00
parent 74808c224a
commit 660406bab2
10 changed files with 59 additions and 23 deletions

View file

@ -21,7 +21,7 @@ uniform sampler2D gbuffer1;
uniform float envmapStrength;
#ifdef _Irr
//!uniform float shirr[27];
//!uniform vec4 shirr[7];
#endif
#ifdef _Rad
uniform sampler2D senvmapRadiance;

View file

@ -1,4 +1,4 @@
uniform float shirr[28];
uniform vec4 shirr[7];
vec3 shIrradiance(const vec3 nor, const float scale) {
const float c1 = 0.429043;
@ -6,16 +6,16 @@ vec3 shIrradiance(const vec3 nor, const float scale) {
const float c3 = 0.743125;
const float c4 = 0.886227;
const float c5 = 0.247708;
vec3 cl00, cl1m1, cl10, cl11, cl2m2, cl2m1, cl20, cl21, cl22;
cl00 = vec3(shirr[0], shirr[1], shirr[2]);
cl1m1 = vec3(shirr[3], shirr[4], shirr[5]);
cl10 = vec3(shirr[6], shirr[7], shirr[8]);
cl11 = vec3(shirr[9], shirr[10], shirr[11]);
cl2m2 = vec3(shirr[12], shirr[13], shirr[14]);
cl2m1 = vec3(shirr[15], shirr[16], shirr[17]);
cl20 = vec3(shirr[18], shirr[19], shirr[20]);
cl21 = vec3(shirr[21], shirr[22], shirr[23]);
cl22 = vec3(shirr[24], shirr[25], shirr[26]);
// TODO: Use padding for 4th component and pass shirr[].xyz directly
vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z);
vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y);
vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x);
vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w);
vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z);
vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y);
vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x);
vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w);
vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z);
return (
c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) +
c3 * cl20 * nor.x * nor.x +

View file

@ -221,7 +221,10 @@ def parse_shader(sres, c, con, defs, lines, parse_attributes):
else: # Constant
if cid.find('[') != -1: # Float arrays
cid = cid.split('[')[0]
ctype = 'floats'
if ctype == 'vec4':
ctype = 'float4s'
else:
ctype = 'floats'
for const in con['constants']:
if const['name'] == cid:
found = True

View file

@ -161,8 +161,13 @@ def compile_project(target_name=None, is_publish=False, watch=False, patch=False
if armutils.get_os() == 'win':
cmd.append('-g')
if (target_name == '' or target_name == '--run') and wrd.arm_gapi_win == 'direct3d9':
cmd.append('direct3d9')
if target_name == '' or target_name == '--run':
if wrd.arm_gapi_win == 'direct3d9':
cmd.append('direct3d9')
elif wrd.arm_gapi_win == 'direct3d11':
cmd.append('direct3d11')
else:
cmd.append('opengl2')
else:
cmd.append('opengl2')

View file

@ -10,6 +10,8 @@ import material.make_mesh as make_mesh
import material.make_shadowmap as make_shadowmap
import material.make_transluc as make_transluc
import material.make_overlay as make_overlay
import material.make_depth as make_depth
import material.make_decal as make_decal
def parse(material, mat_data, mat_users, rid):
wrd = bpy.data.worlds['Arm']

View file

@ -1,5 +1,21 @@
import bpy
import make_state as state
import material.mat_state as mat_state
import material.mat_utils as mat_utils
import armutils
import assets
def make(context_id):
pass
# con_depth = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
# return con_depth
con_depth = mat_state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise', 'color_write_red': False, 'color_write_green': False, 'color_write_blue': False, 'color_write_alpha': False })
vert = con_depth.make_vert()
frag = con_depth.make_frag()
vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix')
vert.write('gl_Position = WVP * vec4(pos, 1.0);')
frag.add_out('vec4 fragColor')
frag.write('fragColor = vec4(0.0);')
return con_depth

View file

@ -218,7 +218,7 @@ def make_forward_base(con_mesh, parse_opacity=False):
if '_Irr' in wrd.world_defs:
frag.add_include('../../Shaders/std/shirr.glsl')
frag.add_uniform('float shirr[28]', link='_envmapIrradiance', included=True)
frag.add_uniform('vec4 shirr[7]', link='_envmapIrradiance', included=True)
if '_Rad' in wrd.world_defs:
frag.add_uniform('sampler2D senvmapRadiance', link='_envmapRadiance')
frag.add_uniform('sampler2D senvmapBrdf', link='_envmapBrdf')

View file

@ -16,6 +16,11 @@ def make(context_id, rpasses):
frag.add_out('vec4 fragColor')
vert.write('vec4 spos = vec4(pos, 1.0);')
# TODO: pass vbuf with proper struct
vert.write('vec3 t1 = nor; // Temp for d3d')
if mat_state.data.is_elem('tex'):
vert.write('vec2 t2 = tex; // Temp for d3d')
parse_opacity = 'translucent' in rpasses
if parse_opacity:
frag.write('vec3 n = vec3(0.0);') # Discard at compile time

View file

@ -30,9 +30,13 @@ class Shader:
if ar[0] == 'sampler2D':
self.context.add_texture_unit(ar[0], ar[1], link=link)
else:
# Prefer vec4[] for d3d to avoid padding
if ar[0] == 'float' and '[' in ar[1]:
ar[0] = 'floats'
ar[1] = ar[1].split('[', 1)[0]
elif ar[0] == 'vec4' and '[' in ar[1]:
ar[0] = 'float4s'
ar[1] = ar[1].split('[', 1)[0]
self.context.add_constant(ar[0], ar[1], link=link)
if included == False and s not in self.uniforms:
self.uniforms.append(s)

View file

@ -62,14 +62,15 @@ project.addSources('Sources');
if wrd.arm_play_console:
f.write("project.addDefine('arm_profile');\n")
if wrd.arm_play_console or wrd.arm_ui:
if wrd.arm_play_console:
f.write(add_armory_library(sdk_path, 'lib/armui'))
p = sdk_path + '/lib/armui/Assets/dejavu.ttf'
f.write('project.addAssets("' + p.replace('\\', '/') + '");\n')
# f.write(add_armory_library(sdk_path, 'lib/haxeui/haxeui-core'))
# f.write(add_armory_library(sdk_path, 'lib/haxeui/haxeui-kha'))
# f.write(add_armory_library(sdk_path, 'lib/haxeui/hscript'))
if wrd.arm_ui:
f.write(add_armory_library(sdk_path, 'lib/haxeui-core'))
f.write(add_armory_library(sdk_path, 'lib/haxeui-kha'))
f.write(add_armory_library(sdk_path, 'lib/hscript'))
if wrd.arm_minimize == False:
f.write("project.addDefine('arm_json');\n")