OpenGL显示空白屏幕.可能是因为着色器
OpenGL showing blank screen. Maybe due to shaders?
我的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());
}
编辑:在建议之后,我通过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(); }
可以这样使用:
gl_call([]{ glDisable(GL_CULL_FACE); });
-
着色器无法编译或链接。看看
glGetShaderiv()
和GL_COMPILE_STATUS
,看看glGetProgramiv()
和GL_LINK_STATUS
。如果他们报告错误,请查看glGetShaderInfoLog()
和glGetProgramInfoLog()
。
至于您提供的部分代码,我认为它没有任何问题。提供着色器和更小、完整的程序可能有助于找到问题。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 密码登录程序将永远循环并显示不正确的结果
- OpenGL显示空白屏幕.可能是因为着色器