小编Jan*_*age的帖子

glDrawArray()给出了一个内存异常

循环遍历我想在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()出了什么问题; 方法?

感谢您抽时间阅读.

c++ memory opengl 3d-engine

29
推荐指数
1
解决办法
688
查看次数

在OpenGL中从Shader读取多个纹理单元的问题

我试图在我的着色器中读取两个不同的纹理,一个用于常规纹理,一个用于凹凸贴图.然而,两个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)

c++ opengl glsl

2
推荐指数
1
解决办法
2481
查看次数

标签 统计

c++ ×2

opengl ×2

3d-engine ×1

glsl ×1

memory ×1