En primer lugar, GL SL (lenguaje de sombreado)
es un lenguaje similar a C, que incluye características útiles específicamente para operaciones vectoriales y de matriz.
Se escribe código Shadder, siempre comenzando con la declaración de versión, luego la lista de entradas y variables de salida, UNIFORM y funciones principales.
La estructura es la siguiente:
#version version_number
in type in_variable_name;
in type in_variable_name;
out type out_variable_name;
uniform type uniform_name;
int main()
{
// Process input(s) and do some weird graphics stuff
...
// Output processed stuff to output variable
out_variable_name = weird_stuff_we_processed;
}
En Vertex Shader, cada variable de entrada también se denomina Atributo de vértice. La propiedad vertex es el límite superior (la primera posición de introducción del triángulo, color, vector de método, textura y otros vértices), generalmente está determinada por el hardware.
OpenGL Asegúrese de que hay al menos 16 propiedades de vértices que contienen 4 puntos disponibles, pero algunos hardware permiten que más propiedades de vértices consulten GL_MAX_VERTEX_ATTRIBS para obtener límites superiores específicos:
GLint nrAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);
std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes
<< std::endl;
- [1] O digo que hasta 16 propiedades de punto superior, ¿cómo puedo tener 16 atributos que contienen 4 puntos, 4 puntos? ¿La dimensión de las coordenadas es la dimensión?
En segundo lugar, estructura de datos GLSL
Estructura de datos, GLSL es 2 contenedores, Vector, Matrices
GLSL también permite el uso de RGBA para describir el color, o utilizar STPQ para acceder a los componentes correspondientes a las coordenadas de textura.
1,Vector:
• VECN: El vector predeterminado de n flotadores. (acceso común, vecn.x x)
• bvecn: un vector de n booleanos.
• ivecn: un vector de n enteros.
• uvecn: un vector de n enteros sin signo.
• dvecn: un vector de n componentes dobles.
Se puede realizar en los datos de la clase contenedoraDESCONCERTANDO,de la siguiente manera:
vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec4 result = vec4(someVec, 0.0f, 0.0f);
vec4 otherResult = vec4(result.xyz, 1.0f);
En tercer lugar, la entrada y salida de Shader
1, ¿por qué Vertex Shader es diferente de Fragment Shader?
Debido a que Vertex es diferente en su entrada, razón:
Vértice recibe directamente datos de vértice y Vertex Data utiliza la etiqueta Ubicación (Ubicación de diseño = 0) en el método de diseño de la CPU. Esta etiqueta puede configurar la propiedad Vertex en la CPU.
El sombreador de vértices requiere etiquetas de ubicación a los datos del vértice de entrada, para establecer el contacto con estos DATOS.
- [2] No sé si se le etiqueta el diseño de los datos de vértice en la CPU, o solo configure las propiedades en el búfer de vértice en la CPU.
Porque Fragment no necesita necesitar una variable de color de VEC4 en su salida. Razón:
El propósito de Fragment Shader es generar el color de salida final, si no especifica un color de salida y, a continuación, renderizarlo en negro (blanco)
2, ¿cómo lograr el intercambio de datos diferente sombreador?
Debe definir Salida, la entrada de definición del sombreador del receptor. Este OpenGL solo transmitirá el mismo tipo de datos cuando vincule el programa Shader.
Código de implementación:
//vertex
#version 420 core
layout (location = 0) in vec3 position;
out vec4 vertexColor;
void main()
{
gl_Position = vec4(position, 1.0);
vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f);
}
//fragment
#version 420 core
in vec4 vertexColor;
out vec4 color;
void main()
{
color = vertexColor;
}
.