[Bf-blender-cvs] [e868b459bb8] blender2.8: Eevee: World nodetree gpumaterial compatibility.
Clément Foucault
noreply at git.blender.org
Mon May 1 18:11:28 CEST 2017
Commit: e868b459bb8efc35012b2364762f3d25d96b8b0d
Author: Clément Foucault
Date: Thu Apr 27 22:27:09 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBe868b459bb8efc35012b2364762f3d25d96b8b0d
Eevee: World nodetree gpumaterial compatibility.
- Unify GPUMaterial creation (world/mesh).
- Support for multiple shader variations (not used for now).
- Convert GPUInputs to DRWUniforms to be used with the draw manager.
- Nodetree Update is not supported. The only way to refresh the shaders is to change render engine.
- Cleanup in GPUPass.
- Add new temporary Node Compatibility type. Compatibility types should be removed in the future.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/draw/engines/eevee/eevee_engine.c
M source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M source/blender/draw/engines/eevee/shaders/default_frag.glsl
M source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M source/blender/draw/engines/eevee/shaders/probe_geom.glsl
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_manager.c
M source/blender/gpu/GPU_material.h
M source/blender/gpu/intern/gpu_codegen.c
M source/blender/gpu/intern/gpu_codegen.h
M source/blender/gpu/intern/gpu_material.c
M source/blender/gpu/shaders/gpu_shader_material.glsl
M source/blender/makesrna/intern/rna_world.c
M source/blender/nodes/shader/nodes/node_shader_tex_environment.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 01d93d98540..219bca0a1a9 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -253,6 +253,7 @@ typedef struct bNodeType {
/* nodetype->compatibility */
#define NODE_OLD_SHADING 1
#define NODE_NEW_SHADING 2
+#define NODE_NEWER_SHADING 3
/* node resize directions */
#define NODE_RESIZE_TOP 1
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 6fa99b37ced..5f7c7787cfc 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -29,6 +29,8 @@
#include "BLI_dynstr.h"
#include "BLI_rand.h"
+
+#include "GPU_material.h"
#include "GPU_glew.h"
#include "eevee_engine.h"
@@ -39,6 +41,8 @@
/* *********** STATIC *********** */
static struct {
+ char *frag_shader_lib;
+
struct GPUShader *default_lit;
struct GPUShader *default_world;
struct GPUShader *depth_sh;
@@ -214,6 +218,16 @@ static void EEVEE_engine_init(void *ved)
(int)viewport_size[0], (int)viewport_size[1],
&tex, 1);
+ if (!e_data.frag_shader_lib) {
+ DynStr *ds_frag = BLI_dynstr_new();
+ BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+ BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
+ BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
+ BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+ e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
+ BLI_dynstr_free(ds_frag);
+ }
+
if (!e_data.depth_sh) {
e_data.depth_sh = DRW_shader_create_3D_depth_only();
}
@@ -222,10 +236,7 @@ static void EEVEE_engine_init(void *ved)
char *frag_str = NULL;
DynStr *ds_frag = BLI_dynstr_new();
- BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
- BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
- BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
- BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+ BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
frag_str = BLI_dynstr_get_cstring(ds_frag);
BLI_dynstr_free(ds_frag);
@@ -345,6 +356,8 @@ static DRWShadingGroup *eevee_cascade_shadow_shgroup(
static void EEVEE_cache_init(void *vedata)
{
+ static int zero = 0;
+
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
@@ -373,26 +386,48 @@ static void EEVEE_cache_init(void *vedata)
psl->probe_background = DRW_pass_create("Probe Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR);
struct Batch *geom = DRW_cache_fullscreen_quad_get();
- DRWShadingGroup *grp;
+ DRWShadingGroup *grp = NULL;
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
World *wo = scene->world;
- if (false) { /* TODO check for world nodetree */
- // GPUMaterial *gpumat = GPU_material_from_nodetree(struct bNodeTree *ntree, ListBase *gpumaterials, void *engine_type, int options)
+ float *col = ts.colorBackground;
+ if (wo) {
+ col = &wo->horr;
}
- else {
- float *col = ts.colorBackground;
- static int zero = 0;
- if (wo) {
- col = &wo->horr;
+ if (wo && wo->use_nodes && wo->nodetree) {
+ struct GPUMaterial *gpumat = GPU_material_from_nodetree(
+ wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, 0,
+ datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib,
+ "#define PROBE_CAPTURE\n"
+ "#define MAX_LIGHT 128\n"
+ "#define MAX_SHADOW_CUBE 42\n"
+ "#define MAX_SHADOW_MAP 64\n"
+ "#define MAX_SHADOW_CASCADE 8\n"
+ "#define MAX_CASCADE_NUM 4\n");
+
+ grp = DRW_shgroup_material_instance_create(gpumat, psl->probe_background, geom);
+
+ if (grp) {
+ DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
+
+ for (int i = 0; i < 6; ++i)
+ DRW_shgroup_call_dynamic_add_empty(grp);
+ }
+ else {
+ /* Shader failed : pink background */
+ static float pink[3] = {1.0f, 0.0f, 1.0f};
+ col = pink;
}
+ }
+ /* Fallback if shader fails or if not using nodetree. */
+ if (grp == NULL) {
grp = eevee_cube_shgroup(e_data.default_world, psl->probe_background, geom);
- DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
DRW_shgroup_uniform_vec3(grp, "color", col, 1);
+ DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
}
}
@@ -591,6 +626,7 @@ static void EEVEE_draw_scene(void *vedata)
static void EEVEE_engine_free(void)
{
+ MEM_SAFE_FREE(e_data.frag_shader_lib);
DRW_SHADER_FREE_SAFE(e_data.default_lit);
DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
DRW_SHADER_FREE_SAFE(e_data.default_world);
@@ -628,7 +664,7 @@ DrawEngineType draw_engine_eevee_type = {
RenderEngineType DRW_engine_viewport_eevee_type = {
NULL, NULL,
- EEVEE_ENGINE, N_("Eevee"), RE_INTERNAL | RE_USE_OGL_PIPELINE,
+ EEVEE_ENGINE, N_("Eevee"), RE_INTERNAL | RE_USE_OGL_PIPELINE | RE_USE_SHADING_NODES,
NULL, NULL, NULL, NULL, NULL, NULL, &EEVEE_collection_settings_create,
&draw_engine_eevee_type,
{NULL, NULL, NULL}
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index fddc9c54cb2..ef8af646ec1 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -54,7 +54,7 @@ struct ShadowMapData {
#define sh_map_bias near_far_bias.z
#ifndef MAX_CASCADE_NUM
-#define MAX_CASCADE_NUM 1
+#define MAX_CASCADE_NUM 4
#endif
struct ShadowCascadeData {
@@ -94,8 +94,6 @@ vec4 saturate(vec4 a) { return vec4(saturate(a.x), saturate(a.y), saturate(a.z),
float distance_squared(vec2 a, vec2 b) { a -= b; return dot(a, a); }
float distance_squared(vec3 a, vec3 b) { a -= b; return dot(a, a); }
-float hypot(float x, float y) { return sqrt(x*x + y*y); }
-
float inverse_distance(vec3 V) { return max( 1 / length(V), 1e-8); }
float line_plane_intersect_dist(vec3 lineorigin, vec3 linedirection, vec3 planeorigin, vec3 planenormal)
diff --git a/source/blender/draw/engines/eevee/shaders/default_frag.glsl b/source/blender/draw/engines/eevee/shaders/default_frag.glsl
index 4cb229e392b..8d4a1e6d523 100644
--- a/source/blender/draw/engines/eevee/shaders/default_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/default_frag.glsl
@@ -3,9 +3,11 @@ uniform vec3 diffuse_col;
uniform vec3 specular_col;
uniform int hardness;
+out vec4 FragColor;
+
void main()
{
float roughness = 1.0 - float(hardness) / 511.0;
roughness *= roughness;
- fragColor = vec4(eevee_surface_lit(worldNormal, diffuse_col, specular_col, roughness), 1.0);
+ FragColor = vec4(eevee_surface_lit(worldNormal, diffuse_col, specular_col, roughness), 1.0);
}
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index 7a0a7b8da91..10d9ce7c4c0 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -28,8 +28,6 @@ layout(std140) uniform shadow_block {
in vec3 worldPosition;
in vec3 worldNormal;
-out vec4 fragColor;
-
/* type */
#define POINT 0.0
#define SUN 1.0
diff --git a/source/blender/draw/engines/eevee/shaders/probe_geom.glsl b/source/blender/draw/engines/eevee/shaders/probe_geom.glsl
index ad112977e9f..5f79e1c6eb8 100644
--- a/source/blender/draw/engines/eevee/shaders/probe_geom.glsl
+++ b/source/blender/draw/engines/eevee/shaders/probe_geom.glsl
@@ -8,7 +8,7 @@ in vec4 vPos[];
in int face[];
out vec3 worldPosition;
-out vec3 worldNormal;
+out vec3 worldNormal; /* Required. otherwise generate linking error on AMD. */
const vec3 maj_axes[6] = vec3[6](vec3(1.0, 0.0, 0.0), vec3(-1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0, 0.0), vec3( 0.0, 0.0, 1.0), vec3( 0.0, 0.0, -1.0));
const vec3 x_axis[6] = vec3[6](vec3(0.0, 0.0, -1.0), vec3( 0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), vec3( 1.0, 0.0, 0.0), vec3(-1.0, 0.0, 0.0));
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 39b8e23db80..29295e8f06d 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -56,6 +56,7 @@
struct bContext;
struct GPUFrameBuffer;
struct GPUShader;
+struct GPUMaterial;
struct GPUTexture;
struct GPUUniformBuffer;
struct Object;
@@ -245,6 +246,8 @@ typedef enum {
} DRWState;
DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
+DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass);
+DRWShadingGroup *DRW_shgroup_material_instance_create(struct GPUMaterial *material, DRWPass *pass, struct Batch *geom);
DRWShadingGroup *DRW_shgroup_instance_create(struct GPUShader *shader, DRWPass *pass, struct Batch *geom);
DRWShadingGroup *DRW_shgroup_point_batch_create(struct GPUShader *shader, DRWPass *pass);
DRWShadingGroup *DRW_shgroup_line_batch_create(struct GPUShader *shader, DRWPass *pass);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 97cd1102406..059ebc6eab3 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -47,11 +47,13 @@
#include "ED_space_api.h"
#include "ED_screen.h"
+#include "intern/gpu_codegen.h"
#include "GPU_batch.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_framebuffer.h"
#include "GPU_lamp.h"
+#include "GPU_material.h"
#include "GPU_shader.h"
#include "GPU_texture.h"
#include "GPU_uniformbuffer.h"
@@ -614,6 +616,80 @@ DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
return shgroup;
}
+DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass)
+{
+ double time = 0.0; /* TODO make time variable */
+ const int max_tex = GPU_max_textures() - 1;
+
+ /* TODO : Ideally we should not convert. But si
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list