循环遍历我想在3D引擎中渲染的所有对象时,尝试调用时出错
glDrawArrays(mesh->primitiveType, 0, mesh->vertexCount);
Run Code Online (Sandbox Code Playgroud)
因为它试图从位置0x0000000读取,所以显然绑定到mesh-> vertexBuffer索引的指针指向零.这一切都发生在我的RenderableObject类中.此类的实例具有绑定到它们的网格,此网格包含应链接到VertexArray的索引.但显然
glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
Run Code Online (Sandbox Code Playgroud)
失败了.
奇怪的是,它将在我的Mac和各种其他Windows计算机上运行 - 但它不会在这台(Windows)计算机上运行.因为我正在测试我删除了所有3D模型,并发现它是导致问题的原语,不知何故,MSVC++编译器"优化"了我的代码,以便删除所有内容
glGenBuffers(1, &CubeMesh.vertexBuffer);
Run Code Online (Sandbox Code Playgroud)
这可能就是为什么没有任何约束,或者我认为.我禁用了链接器/编译器优化,我现在可以看到allbreakpoints会被击中 - 但我仍然得到相同的异常,而且我完全不知道为什么它不起作用.
整个项目的源代码可以在@ https://github.com/Wrap/TwinGame/tree/master/src找到,据我所知,问题出现在Primitives.cpp和/或RenderableObject.cpp中. (特别是RenderableObject :: Draw();方法)文件.我是否正在尝试阅读受保护的内容,LoadPrimitives()出了什么问题; 方法?
感谢您抽时间阅读.
我试图在我的着色器中读取两个不同的纹理,一个用于常规纹理,一个用于凹凸贴图.然而,两个Sampler2D都从相同的纹理单元读取.我将制服设置为0和1然而,我将纹理绑定到各自的单位,如下所示:
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texMgr->GetTexture("stone")->texture);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texMgr->GetTexture("bump")->texture);
Run Code Online (Sandbox Code Playgroud)
在我的渲染循环中,我将制服设置如下:
shaderMgr->activeProgram()->setUniform1f("tex", 0);
shaderMgr->activeProgram()->setUniform1f("norm", 1);
Run Code Online (Sandbox Code Playgroud)
最后我的着色器代码:
varying vec4 colorVarying;
varying vec4 normalVarying;
varying vec3 lightDirVarying;
varying vec2 textureCoordinateVarying;
uniform sampler2D tex;
uniform sampler2D norm;
void main() {
vec4 texColor = texture2D(tex, textureCoordinateVarying);
vec4 normColor = texture2D(norm, textureCoordinateVarying);
vec3 newNormal = vec3(2.0 * normColor.x - 1.0, 2.0 * normColor.y - 1.0, 2.0 * normColor.z - 1.0);
vec3 normal = normalize(normalVarying.xyz + newNormal);
float diff = max(0.0, dot(normal, normalize(lightDirVarying)));
gl_FragColor = texColor * …Run Code Online (Sandbox Code Playgroud)