opengl 添加变换后对象渲染异常

oxcyiej7  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(172)

我在我的C OpenGL程序中添加变换。我使用CGLM作为我的数学库。程序没有警告或错误。然而,当我编译和运行程序时,我得到了我想要的图像的扭曲版本(在添加变换之前它没有扭曲)。
下面是我的程序的主循环:

// Initialize variables for framerate counting
double lastTime = glfwGetTime();
int frameCount = 0;

// Program loop
while (!glfwWindowShouldClose(window)) {
    // Calculate framerate
    double thisTime = glfwGetTime();
    frameCount++;

    // If a second has passed.
    if (thisTime - lastTime >= 1.0) {
        printf("%i FPS\n", frameCount);

        frameCount = 0;
        lastTime = thisTime;
    }

    processInput(window);

    // Clear the window
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // Bind textures on texture units
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, texture2);

    // Create transformations
    mat4 transform = {{1.0f}};
    glm_mat4_identity(transform);

    glm_translate(transform, (vec3){0.5f, -0.5f, 0.0f});
    glm_rotate(transform, (float)glfwGetTime(), (vec3){0.0f, 0.0f, 1.0f});

    // Get matrix's uniform location and set matrix
    shaderUse(myShaderPtr);
    GLint transformLoc = glGetUniformLocation(myShaderPtr->shaderID, "transform");
    // mat4 transform;
    glUniformMatrix4fv(transformLoc, 1, GL_FALSE, (float*)transform);

    glBindVertexArray(VAO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    glfwSwapBuffers(window); // Swap the front and back buffers
    glfwPollEvents(); // Check for events (mouse movement, mouse click, keyboard press, keyboard release etc.)
}

如果你想查看完整的代码,这个程序在github here上。
程序的输出如下(正方形也旋转):

然而,该程序的预期输出是在顶部以20%不透明度显示的企鹅和在企鹅下面以100%不透明度显示的框。

ldfqzlk8

ldfqzlk81#

在顶点着色器中,纹理坐标的位置是1:


# version 330 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

但是,当您指定顶点时,位置1用于颜色属性,位置2用于文字坐标:

// Colour attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

// Texture coord attribute
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);

移除颜色属性并使用位置1作为纹理坐标。例如:

// Texture coord attribute
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(1);
cvxl0en2

cvxl0en22#

查看源代码,您将传入三个属性(位置、颜色和纹理坐标),但顶点着色器只接受两个属性。
移除颜色属性并将纹理坐标作为属性#1而不是#2传递,应该会使其看起来像预期的那样。

相关问题