mirror of
https://github.com/raysan5/raylib.git
synced 2026-02-04 13:19:17 -05:00
Rework some sentences and fix some grammar
@ -1,8 +1,8 @@
|
|||||||
Dealing with custom shaders and make them generic is not an easy task. There are many things to consider for a shader because, after all, the shader is the responsible to process all the data send to the GPU (mesh, materials, textures, lighting) to generate the final frame.
|
Dealing with custom shaders and making them generic is not an easy task. There are many things to consider for a shader because, after all, the shader is responsible for processing all the data sent to the GPU (e.g. mesh, materials, textures, lighting) to generate the final frame.
|
||||||
|
|
||||||
Find an unified generic shader to deal with all kind of stuff is very complicated and, after analyzing some of the big engines out there, I decided to go for a custom uber-shader-based solution.
|
Finding a unified generic shader to deal with all kinds of stuff is very complicated and, after analyzing some of the big engines out there, I decided to go for a custom uber-shader-based solution.
|
||||||
|
|
||||||
By default, raylib shader struct support the following data:
|
By default, raylib's shader struct supports the following data:
|
||||||
```c
|
```c
|
||||||
typedef struct Shader {
|
typedef struct Shader {
|
||||||
unsigned int id; // Shader program id
|
unsigned int id; // Shader program id
|
||||||
@ -28,22 +28,22 @@ typedef struct Shader {
|
|||||||
|
|
||||||
As you can see, most of the location points are pre-defined **on shader loading**; custom shaders developed for raylib must follow those conventions.
|
As you can see, most of the location points are pre-defined **on shader loading**; custom shaders developed for raylib must follow those conventions.
|
||||||
|
|
||||||
On shader loading, following fixed location names are expected for maps:
|
On shader load, the following fixed location names are expected for maps:
|
||||||
```glsl
|
```glsl
|
||||||
uniform sampler2D texture0; // GL_TEXTURE0
|
uniform sampler2D texture0; // GL_TEXTURE0
|
||||||
uniform sampler2D texture1; // GL_TEXTURE1
|
uniform sampler2D texture1; // GL_TEXTURE1
|
||||||
uniform sampler2D texture2; // GL_TEXTURE2
|
uniform sampler2D texture2; // GL_TEXTURE2
|
||||||
```
|
```
|
||||||
|
|
||||||
Shaders are also directly related to Material struct:
|
Shaders are also directly related to the Material struct:
|
||||||
```c
|
```c
|
||||||
// Material type
|
// Material type
|
||||||
typedef struct Material {
|
typedef struct Material {
|
||||||
Shader shader; // Standard shader (supports 3 map textures)
|
Shader shader; // Standard shader (supports 3 map textures)
|
||||||
|
|
||||||
Texture2D texDiffuse; // Diffuse texture (binded to shader mapTexture0Loc)
|
Texture2D texDiffuse; // Diffuse texture (bound to shader mapTexture0Loc)
|
||||||
Texture2D texNormal; // Normal texture (binded to shader mapTexture1Loc)
|
Texture2D texNormal; // Normal texture (bound to shader mapTexture1Loc)
|
||||||
Texture2D texSpecular; // Specular texture (binded to shader mapTexture2Loc)
|
Texture2D texSpecular; // Specular texture (bound to shader mapTexture2Loc)
|
||||||
|
|
||||||
Color colDiffuse; // Diffuse color
|
Color colDiffuse; // Diffuse color
|
||||||
Color colAmbient; // Ambient color
|
Color colAmbient; // Ambient color
|
||||||
@ -52,9 +52,9 @@ typedef struct Material {
|
|||||||
float glossiness; // Glossiness level (Ranges from 0 to 1000)
|
float glossiness; // Glossiness level (Ranges from 0 to 1000)
|
||||||
} Material;
|
} Material;
|
||||||
```
|
```
|
||||||
Where three texture maps (texDiffuse, texNormal, texSpecular) are binded to shader location points.
|
Where three texture maps (texDiffuse, texNormal, texSpecular) will bind to shader location points.
|
||||||
|
|
||||||
On drawing, depending on textures assigned to material and selected shader, they are internally binded on drawing or not:
|
When drawing, textures are internally bound or not depending on the selected shader and material:
|
||||||
```c
|
```c
|
||||||
// Default material loading example
|
// Default material loading example
|
||||||
Material material = LoadDefaultMaterial(); // Default shader assigned to material (supports only diffuse map)
|
Material material = LoadDefaultMaterial(); // Default shader assigned to material (supports only diffuse map)
|
||||||
@ -67,4 +67,4 @@ material.texDiffuse = LoadTexture("wood_diffuse.png"); // texture unit 0 act
|
|||||||
material.texSpecular = LoadTexture("wood_specular.png"); // texture unit 2 NOT activated (not available in material shader)
|
material.texSpecular = LoadTexture("wood_specular.png"); // texture unit 2 NOT activated (not available in material shader)
|
||||||
```
|
```
|
||||||
|
|
||||||
Despite its name on material struct (`texDiffuse`, `texNormal`, `texSpecular`), user is free to use those maps in any way inside the **custom** shader.
|
Despite its name on material struct (`texDiffuse`, `texNormal`, `texSpecular`), the user is free to use those maps in any way inside the **custom** shader.
|
||||||
|
|||||||
Reference in New Issue
Block a user