From c7dd003ae5622767f6bebc40495a05308891eddd Mon Sep 17 00:00:00 2001 From: Vlad-Zumer <21068598+Vlad-Zumer@users.noreply.github.com> Date: Wed, 7 Feb 2024 19:17:15 +0000 Subject: [PATCH] Added section for explaining `DrawMeshInstanced` --- Frequently-Asked-Questions.md | 124 +++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/Frequently-Asked-Questions.md b/Frequently-Asked-Questions.md index a62d296..f4c298d 100644 --- a/Frequently-Asked-Questions.md +++ b/Frequently-Asked-Questions.md @@ -20,6 +20,7 @@ - [Why are my sound files not working?](#why-are-my-sound-files-not-working) - [How do I setup a custom icon for my executable?](#how-do-i-setup-a-custom-icon-for-my-executable) - [How I deal with UTF-16 strings?](#how-i-deal-with-utf-16-strings) +- [Why does `DrawMeshInstanced` not draw anything?](#why-does-drawmeshinstanced-not-draw-anything) ## Can I run raylib in my old PC? @@ -297,4 +298,125 @@ UnloadImage(icon); ## How I deal with UTF-16 strings? -raylib supports by default UTF-8 strings, actually, text drawing functions expect to receive UTF-8 strings as inputs but sometimes source text is provided as UTF-16. [Here is a handy conversion library](https://gist.github.com/gulrak/2eda01eacebdb308787b639fa30958b3). \ No newline at end of file +raylib supports by default UTF-8 strings, actually, text drawing functions expect to receive UTF-8 strings as inputs but sometimes source text is provided as UTF-16. [Here is a handy conversion library](https://gist.github.com/gulrak/2eda01eacebdb308787b639fa30958b3). + +## Why does `DrawMeshInstanced` not draw anything? + +You are likely using the default material when calling the function. `DrawMeshInstanced` does not work with the default shader. + +To create a vertex shader that would work with instancing, you must provide an input for the model transform matrix (the transform matrix for the instance) as a vertex attribute, and link its location to `SHADER_LOC_MATRIX_MODEL`. By default `SHADER_LOC_MATRIX_MODEL` binds as an uinform input in yout shader, you must use `GetShaderLocationAttrib` to bind to it as an attribute. + +
+Vertex Shader Example + +```glsl +#version 330 + +// Input vertex attributes +in vec3 vertexPosition; // vertex position relative to origin +in vec2 vertexTexCoord; // texture coord of vertex +in mat4 instanceTransform; // model transformation matrix + +// Input uniform values +uniform mat4 mvp; // model-view-projection + +// Output vertex attributes (to fragment shader) +out vec2 fragTexCoord; + +void main() +{ + // Pass texture coord + fragTexCoord = vertexTexCoord; + // Compute MVP for current instance + mat4 mvpi = mvp*instanceTransform; + // Calculate final vertex position + gl_Position = mvpi*vec4(vertexPosition, 1.0); +} +``` + +
+ + +
+Fragment Shader Example + +```glsl +#version 330 + +// Input vertex attributes (from vertex shader) +in vec3 fragPosition; +in vec2 fragTexCoord; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// Output fragment color +out vec4 finalColor; + +void main() +{ + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord); + // colorize texture with diffuse color + finalColor = colDiffuse*texelColor; +} +``` + +
+ +
+Full C Example + +```c + const char fs[] = + "#version 330 \n" + " \n" + "// Input vertex attributes (from vertex shader) \n" + "in vec3 fragPosition; \n" + "in vec2 fragTexCoord; \n" + " \n" + "// Input uniform values \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + " \n" + "// Output fragment color \n" + "out vec4 finalColor; \n" + " \n" + "void main() \n" + "{ \n" + " // Texel color fetching from texture sampler \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " // colorize texture with diffuse color \n" + " finalColor = colDiffuse*texelColor; \n" + "} \n"; + + const char vs[] = + "#version 330 \n" + " \n" + "// Input vertex attributes \n" + "in vec3 vertexPosition; // vertex position relative to origin \n" + "in vec2 vertexTexCoord; // texture coord of vertex \n" + "in mat4 instanceTransform; // model transformation matrix \n" + " \n" + "// Input uniform values \n" + "uniform mat4 mvp; // model-view-projection \n" + " \n" + "// Output vertex attributes (to fragment shader) \n" + "out vec2 fragTexCoord; \n" + " \n" + "void main() \n" + "{ \n" + " // Pass texture coord \n" + " fragTexCoord = vertexTexCoord; \n" + " // Compute MVP for current instance \n" + " mat4 mvpi = mvp*instanceTransform; \n" + " // Calculate final vertex position \n" + " gl_Position = mvpi*vec4(vertexPosition, 1.0); \n" + "} \n"; + + Shader shader = LoadShaderFromMemory(vs, fs); + shader.locs[SHADER_LOC_MATRIX_MODEL] = GetShaderLocationAttrib(shader, "instanceTransform"); +``` + +