我正在嘗試將一些照明應用於紋理。 我創建了一個紋理立方體,並在其中放置了一個相機。 現在,我想點亮它的內在面孔。我已經告訴我應該使用着色器,所以我看了很多教程和我創建:用着色器在OpenGL中照明
頂點着色器:
const GLchar* vertexSkySource =
#if defined(__APPLE_CC__)
"#version 150 core\n"
#else
"#version 130\n"
#endif
"uniform mat3 view_rot;"
"in vec3 position;"
"out vec3 Coord;"
"void main() {"
" Coord = view_rot * position;"
" gl_Position = vec4(position, 1.0);"
"}";
片段着色器
const GLchar* fragmentSkySource =
#if defined(__APPLE_CC__)
"#version 150 core\n"
#else
"#version 130\n"
#endif
"in vec3 Coord;"
"out vec4 outColor;"
"uniform samplerCube textureSampler;"
"void main() {"
" outColor = texture(textureSampler, Coord);"
"}";
我後初始化它們
void initialize_shader()
{
// shader per la skybox
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSkySource, NULL);
glCompileShader(vertexShader);
{
GLchar log[512];
GLsizei slen = 0;
glGetShaderInfoLog(vertexShader, 512, &slen, log);
if (slen)
std::cerr << log << std::endl;
}
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSkySource, NULL);
glCompileShader(fragmentShader);
{
GLchar log[512];
GLsizei slen = 0;
glGetShaderInfoLog(fragmentShader, 512, &slen, log);
if (slen)
std::cerr << log << std::endl;
}
skyProgram = glCreateProgram();
glAttachShader(skyProgram, vertexShader);
glAttachShader(skyProgram, fragmentShader);
glBindFragDataLocation(skyProgram, 0, "outColor");
glLinkProgram(skyProgram);
GLint status = 0;
glGetProgramiv(skyProgram, GL_LINK_STATUS, &status);
if (!status)
{
std::cout << "failed to link" << std::endl;
GLchar log[256];
GLsizei slen = 0;
glGetProgramInfoLog(skyProgram, 256, &slen, log);
std::cout << log << std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
然後在我的畫法,將裏面main
方法被調用我這樣做:
glm::vec3 light_direction = glm::normalize(glm::vec3(1.f, 1.f, 3.f));
glm::vec3 light_position = glm::vec3(1.0f, 1.0f, 0.0f);
glm::vec3 light_intensity = glm::vec3(1.f, 1.f, 1.f);
glDepthMask(GL_FALSE);
glUseProgram(skyProgram);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube);
glUniform1i(glGetUniformLocation(skyProgram, "textureSampler"), 3);
glUniform3fv(glGetUniformLocation(skyProgram, "light_direction"), 1, &light_direction[0]);
glUniform3fv(glGetUniformLocation(skyProgram, "light_intensity"), 1, &light_intensity[0]);
glUniform3fv(glGetUniformLocation(skyProgram, "view_position"), 1, &camera_position[0]);
glUniform1f(glGetUniformLocation(skyProgram, "shininess"), 60); // shininess = 60, range is [0.0 - 128.0]
glUniformMatrix3fv(glGetUniformLocation(skyProgram, "view_rot"), 1, GL_FALSE, &(glm::mat3(glm::inverse(view)))[0][0]);
我看不到燈光立方體的面孔,我應該怎麼添加到我着色器?
從我看來,你無處計算着色器中的任何照明。你肯定會得到OpenGL錯誤,因爲你正試圖設置着色器中不存在的制服。 – BDL
@BDL:實際上,設置位置爲-1的制服顯然不會在GL中產生錯誤。 – derhass