OpengGL-GLSL 상세 해석(블로거 기사의 착색기 코드만 해석)
7150 단어 OPENGL현대 OpenGL 초보자 입문
첫 번째 삼각형과 직사각형 (두 삼각형)
일반 음영처리 및 Shader 클래스(코드 및 사용법)
텍스쳐 부착(모든 코드 및 stb image.h 사용)
매트릭스 변환(축소, 회전, 위치 이동)을 이용하여glm 라이브러리를 사용합니다
좌표계, 3D 세계로 진입(깊이 테스트)
본고는 저와 함께 OpenGL을 배운 샤오백에게 쓴 것일 뿐입니다. 블로거의 일부 문장 착색기 코드의 해석일 뿐 대신과 이전 문장을 보지 않은 독자들에게는 적합하지 않습니다.
글에서 색기 부분 코드에 대한 해독은 여기에 보충되어 있지 않다.
첫 번째 삼각형과 직사각형 (두 삼각형)
main.cpp 부분 코드
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
정점 셰이더 부분 코드
//
const char *vertexShaderSource = "#version 330 core
"
"layout (location = 0) in vec3 aPos;
"
"void main()
"
"{
"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
"
"}\0";
#version 330 core는 OpengGL 버전을 반드시 선언합니다.
layout (location = 0) in vec3 aPos; main에 귀속된 것은 0번으로 세 번 간격으로 파기 때문에location은 0이고 aPos는 in 변수로 읽습니다
gl_Position은 내장 출력 변수로 방금 얻은 aPos 확장된 w 변수를gl 에 부여합니다Position을 사용하면 됩니다.
세그먼트 셰이더 부분 코드
//
const char *fragmentShaderSource = "#version 330 core
"
"out vec4 FragColor;
"
"void main()
"
"{
"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
"
"}
\0";
FragColor 출력 변수는 RGB의 세 가지 값에 해당하는 첫 번째 세 개의 값을 다음 파이프라인에 사용하고, 다음 세 개의 값은 기본 1.0입니다.0.0f는 0, 1.0f는 255입니다.
일반 음영처리 및 Shader 클래스(코드 및 사용법)
main.cpp의 코드
glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(6);
glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(7);
교점 착색기
#version 330 core
layout (location = 6) in vec3 aPos;
layout (location = 7) in vec3 aColor;
out vec4 vertexColor;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor = vec4(aColor.x, aColor.y, aColor.z, 1.0);
}
layout (location = 6) in vec3 aPos;정점 위치main에서 사용하는 것은 6호로 6개 간격으로 3개를 파는데 정점 수조에 색깔이 포함되어 있기 때문이다.layout (location = 7) in vec3 aColor;정점 컬러main에 사용되는 것은 7호로 6개 간격으로 3개를 파낸다.out vec4 vertexColor;정점 색 출력 벡터, 세그먼트 착색기에서 직접 사용하기 때문에 착색기에서 죽을 필요가 없습니다
#version 330 core
in vec4 vertexColor;
out vec4 FragColor;
void main()
{
FragColor = vertexColor;
}
in vec4 vertexColor;정점 색상 입력 벡터, 정점 착색기에서 입력한 것으로 FragColor에 직접 전달합니다. 이렇게 하면 색상이 착색기에서 죽을 필요가 없습니다.
텍스쳐 부착(모든 코드 및 stb image.h 사용)
main.cpp의 코드
glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(6);
glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(7);
glVertexAttribPointer(8, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(8);
//
myShader->use();
glUniform1i(glGetUniformLocation(myShader->ID, "ourTexture"), 0); //
myShader->setInt("ourFace", 3); //
정점 셰이더 부분 코드
#version 330 core
layout (location = 6) in vec3 aPos;
layout (location = 7) in vec3 aColor;
layout (location = 8) in vec2 aTexCoord;
out vec4 vertexColor;
out vec2 TexCoord;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor = vec4(aColor.x, aColor.y, aColor.z, 1.0);
TexCoord = aTexCoord;
}
layout (location = 8) in vec2 aTexCoord;무늬 좌표main 함수에 귀속된 것은 678호, 8호는 무늬 좌표로 저장되어 있는데 이번에는 8개 간격으로 한 번 파낸다.
out vec2 TexCoord;텍스쳐 좌표out형, 다음 단계로 내보내기
세그먼트 셰이더 부분 코드
#version 330 core
out vec4 FragColor;
in vec4 vertexColor;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform sampler2D ourFace;
void main()
{
//FragColor = vertexColor;
FragColor = mix(texture(ourTexture, TexCoord), texture(ourFace, TexCoord), 0.6)*vertexColor;
}
in vec2 TexCoord;읽어들인 텍스쳐 좌표
uniform sampler2D ourTexture;2차원 무늬 샘플러 유니폼 변수가 착색기 밖의main.cpp에서도 uniform sampler2D ourFace를 사용할 수 있습니다.두 번째 무늬에 대응하는 2차원 무늬 샘플러
GLSL에 내장된 믹스 함수는 두 개의 값을 매개 변수로 받아들여 세 번째 매개 변수에 따라 선형 삽입값을 해야 한다.세 번째 값이
0.0
이면 첫 번째 입력을 되돌려줍니다.1.0
인 경우 두 번째 입력 값이 반환됩니다.0.6
는 40%
의 첫 번째 입력 색상과 60%
의 두 번째 입력 색상, 즉 두 텍스처의 블렌드 색상을 반환합니다.매트릭스 변환(축소, 회전, 위치 이동)을 이용하여glm 라이브러리를 사용합니다
main.cpp의 일부 코드
unsigned int transformLoc = glGetUniformLocation(myShader->ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
정점 셰이더 부분 코드
#version 330 core
layout (location = 6) in vec3 aPos;
layout (location = 7) in vec3 aColor;
layout (location = 8) in vec2 aTexCoord;
out vec4 vertexColor;
out vec2 TexCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor = vec4(aColor.x, aColor.y, aColor.z, 1.0);
TexCoord = aTexCoord;
}
gl_Position = transform * vec4(aPos.x, aPos.y, aPos.z, 1.0);행렬 곱셈을 이용하여 정점의 위치를 바꾸는 것도 앞에서 왜 w변수를 보충했는가이다.
좌표계, 3D 세계로 진입(깊이 테스트)
main.cpp의 일부 코드
unsigned int modelMatLoc = glGetUniformLocation(myShader->ID, "modelMat");
unsigned int viewMatLoc = glGetUniformLocation(myShader->ID, "viewMat");
unsigned int projMatLoc = glGetUniformLocation(myShader->ID, "projMat");
glUniformMatrix4fv(modelMatLoc, 1, GL_FALSE, glm::value_ptr(modelMat));
glUniformMatrix4fv(viewMatLoc, 1, GL_FALSE, glm::value_ptr(viewMat));
glUniformMatrix4fv(projMatLoc, 1, GL_FALSE, glm::value_ptr(projMat));
정점 셰이더 부분 코드
#version 330 core
layout (location = 6) in vec3 aPos;
layout (location = 8) in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 modelMat;
uniform mat4 viewMat;
uniform mat4 projMat;
void main()
{
gl_Position = projMat * viewMat * modelMat * vec4(aPos.x, aPos.y, aPos.z, 1.0);
TexCoord = aTexCoord;
}
gl_Position = projMat * viewMat * modelMat * vec4(aPos.x, aPos.y, aPos.z, 1.0);세 개의 행렬을 곱하여 더욱 좋은 3d 디스플레이를 실현하였다
더 많은 OpenGL 지식: 현대 OpenGL 입문 강좌
질문이 있으면 아래의 평론을 바랍니다. 전재는 출처를 밝히고 원문 링크를 첨부해 주십시오. 감사합니다!만약 권리 침해가 있으면 제때에 연락하십시오.