use*_*009 0 c++ sdl opengl-es ios
我的 OpenGL ES 应用程序无法运行。我使用 SDL 进行窗口管理,它保存上下文。环顾四周后,我注意到顶点着色器和片段着色器在调试器上显示为 0。连程序都是0。这会是一个原因吗?我按照着色器编译代码并将代码链接到之前制作的模板。
如果是的话,有什么问题吗?这是代码:
GLuint ShaderHelper::compileShader(GLenum type, std::string fileName) {
std::string fileContents;
std::ifstream fin;
std::string path;
// Getting the necessary path...
// These are abstractions for getting file contents
// from the main bundle.
if (type == GL_VERTEX_SHADER) {
FileOpener opener;
path = opener.retriveFileFromBundle(fileName, "vsh");
} else if (type == GL_FRAGMENT_SHADER) {
FileOpener opener;
path = opener.retriveFileFromBundle(fileName, "fsh");
} else {
std::cout << "ERROR: Invalid shader type at filename " << fileName << std::endl;
exit(1);
}
fin.open(path);
if (!fin.is_open()) {
std::cout << "ERROR: Failed to open file " << fileName << std::endl;
exit(1);
}
// Retrieving the string from the file...
while (!fin.eof()) {
char CLine[255];
fin.getline(CLine, 255);
std::string line = CLine;
fileContents = fileContents + line;
fileContents = fileContents + " \n";
}
fin.close();
// I'm creating these variables because a pointer is needed for
// glShaderSource
GLuint shaderHandle = glCreateShader(type);
const GLint shaderStringLength = (GLint)fileContents.size();
const GLchar *shaderCString = fileContents.c_str();
glShaderSource(shaderHandle, 1, &shaderCString, &shaderStringLength);
glCompileShader(shaderHandle);
return shaderHandle;
}
void ShaderHelper::linkProgram(std::vector<GLuint *> shaderArray) {
program = glCreateProgram();
for (int i = 0; i < shaderArray.size(); i++) {
glAttachShader(program, *shaderArray[i]);
}
glLinkProgram(program);
}
void ShaderHelper::addUniform(uniform_t uniform) {
std::string name = uniform.name;
uniforms[name] = uniform;
// With that step done, we need to assign the location...
uniforms[name].location = glGetUniformLocation(program, uniforms[name].name.c_str());
}
Run Code Online (Sandbox Code Playgroud)
编辑:经过建议,我通过 glError() 运行了我的代码。我修复了一个错误,但仍然出现黑屏。我的着色器值不再是 0。我将 glClearColor 设置为白色图像,它只是显示纯白色。我调整了MV矩阵和投影矩阵中的数字,但仍然什么也没有。我禁用了面部剔除,但仍然没有任何结果。此外,着色器编译和链接良好。那么现在怎么办?
可怕的黑屏可能是由多种问题引起的:
您的上下文未正确创建,或者您没有正确呈现场景。将您的透明颜色更改为黑色以外的其他颜色是否会显示任何内容?
你的变换矩阵是错误的。你如何设置“相机”的位置?您是否使用GLM之类的东西来设置矩阵?如果是这样,请查看glm::perspective()和glm:::lookAt()。确保将矩阵传递给着色器并使用它gl_Position在顶点着色器中进行设置。
您尝试显示的几何图形背向观看者。尝试glDisable(GL_CULL_FACE)。如果有效,请颠倒顶点的顺序。
OpenGL 调用在某处失败。请务必glGetError()在每次通话后进行检查。我通常有类似以下内容:
struct gl_checker
{
~gl_checker()
{
const auto e = glGetError();
assert(e == GL_NO_ERROR);
}
};
template <class F>
inline auto gl_call(F f) -> decltype(f())
{
gl_checker gc;
return f();
}
Run Code Online (Sandbox Code Playgroud)
可以这样使用:
gl_call([]{ glDisable(GL_CULL_FACE); });
Run Code Online (Sandbox Code Playgroud)您的着色器无法编译或链接。看看glGetShaderiv()withGL_COMPILE_STATUS和glGetProgramiv()with GL_LINK_STATUS。如果他们报告错误,请查看glGetShaderInfoLog()和glGetProgramInfoLog()。
至于您提供的部分代码,我认为它没有任何严格的错误。提供着色器和一个更小、更完整的程序可能有助于发现问题。
| 归档时间: |
|
| 查看次数: |
1990 次 |
| 最近记录: |