【发布时间】:2016-09-05 10:10:42
【问题描述】:
我正在尝试对纹理应用一些光照。 我创建了一个带纹理的立方体,并在其中放置了一个相机。 现在,我想照亮它的内部面。有人告诉我应该使用着色器,所以我阅读了很多教程并创建了:
顶点着色器:
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 方法中调用的 draw 方法中,我这样做:
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:实际上,使用位置 -1 设置制服显然不会在 GL 中产生错误。
标签: opengl