2

我正在学习 OpenGL 3.3,使用一些教程 (http://opengl-tutorial.org)。在我正在使用的教程中,有一个顶点着色器,它执行以下操作:

教程着色器源

#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;

// Values that stay constant for the whole mesh.
uniform mat4 MVP;

void main(){

    // Output position of the vertex, in clip space : MVP * position
    gl_Position =  MVP * vec4(vertexPosition_modelspace,1);

}

然而,当我尝试在我的应用程序中模拟相同的行为时,我得到以下信息:

error: implicit cast from "vec4" to "vec3".

看到这个后,我不确定是不是因为我使用的是 4.2 版本的着色器而不是 3.3,所以更改了所有内容以匹配作者一直使用的内容,之后仍然收到相同的错误。

所以,我改变了我的着色器来做到这一点:

我的(最新)来源

#version 330 core

layout(location = 0) in vec3 vertexPosition_modelspace;

uniform mat4 MVP;

void main()
{
    vec4 a = vec4(vertexPosition_modelspace, 1);    

    gl_Position.xyz = MVP * a;
}

当然,这仍然会产生相同的错误。

有谁知道为什么会这样,以及对此的解决方案可能是什么?我不确定它是否是我的调用代码(我已经发布了,以防万一)。


调用代码

static const GLfloat T_VERTEX_BUF_DATA[] = 
{
    // x, y z
    -1.0f, -1.0f, 0.0f,
     1.0f, -1.0f, 0.0f,
     0.0f, 1.0f, 0.0f
};

static const GLushort T_ELEMENT_BUF_DATA[] = 
{ 0, 1, 2 };

void TriangleDemo::Run(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    GLuint matrixID = glGetUniformLocation(mProgramID, "MVP");

    glUseProgram(mProgramID);

    glUniformMatrix4fv(matrixID, 1, GL_FALSE, &mMVP[0][0]); // This sends our transformation to the MVP uniform matrix, in the currently bound vertex shader 

    const GLuint vertexShaderID = 0;

    glEnableVertexAttribArray(vertexShaderID);
    glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
    glVertexAttribPointer(
        vertexShaderID, // Specify the ID of the shader to point to (in this case, the shader is built in to GL, which will just produce a white triangle)
        3,              // Specify the number of indices per vertex in the vertex buffer  
        GL_FLOAT,       // Type of value the vertex buffer is holding as data
        GL_FALSE,       // Normalized? 
        0,              // Amount of stride
        (void*)0 );     // Offset within the array buffer

    glDrawArrays(GL_TRIANGLES, 0, 3); //0 => start index of the buffer, 3 => number of vertices

    glDisableVertexAttribArray(vertexShaderID);
}

void TriangleDemo::Initialize(void)
{
    glGenVertexArrays(1, &mVertexArrayID);

    glBindVertexArray(mVertexArrayID);

    glGenBuffers(1, &mVertexBuffer);

    glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);

    glBufferData(GL_ARRAY_BUFFER, sizeof(T_VERTEX_BUF_DATA), T_VERTEX_BUF_DATA, GL_STATIC_DRAW );

    mProgramID = LoadShaders("v_Triangle", "f_Triangle");

    glm::mat4 projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f); // field of view, aspect ratio (4:3), 0.1 units near, to 100 units far

    glm::mat4 view  = glm::lookAt(
                                glm::vec3(4, 3, 3), // Camera is at (4, 3, 3) in world space
                                glm::vec3(0, 0, 0), // and looks at the origin
                                glm::vec3(0, 1, 0)  // this is the up vector - the head of the camera is facing upwards. We'd use (0, -1, 0) to look upside down
                            );

    glm::mat4 model = glm::mat4(1.0f); // set model matrix to identity matrix, meaning the model will be at the origin

    mMVP            = projection * view * model;

}

笔记

  • 我在 Visual Studio 2012
  • 我正在使用Shader Maker进行 GLSL 编辑
4

3 回答 3

4

我不能说教程代码有什么问题。

不过,在“我的最新消息来源”中,有

gl_Position.xyz = MVP * a;

这看起来很奇怪,因为您将 a 分配vec4给 a vec3


编辑

我无法重现您的问题。

我使用了一个简单的片段着色器进行测试......

#version 330 core

void main()
{
}

测试“教程着色器源”

3.3.11762 Core Profile Context
Log: Vertex shader was successfully compiled to run on hardware.

Log: Fragment shader was successfully compiled to run on hardware.

Log: Vertex shader(s) linked, fragment shader(s) linked.

测试“我的最新来源”

3.3.11762 Core Profile Context
Log: Vertex shader was successfully compiled to run on hardware.
 WARNING: 0:11: warning(#402) Implicit truncation of vector from size 4 to size 3.

Log: Fragment shader was successfully compiled to run on hardware.

Log: Vertex shader(s) linked, fragment shader(s) linked.

gl_Position.xyz替换为后警告消失gl_Position


你的设置是什么?你有正确版本的 OpenGL 上下文吗?glGetError() 是静音的吗?

最后,您的 GPU 驱动程序是最新的吗?

于 2012-10-10T15:12:11.090 回答
3

我遇到了一些 GPU(我相信是 ATi 的)在需要浮点数时不喜欢整数文字的问题。尝试改变

gl_Position =  MVP * vec4(vertexPosition_modelspace,1);

gl_Position =  MVP * vec4(vertexPosition_modelspace, 1.0);
于 2012-10-10T19:17:48.260 回答
2

我刚刚在安装了最新驱动程序的 ATI Radeon HD 7900 上遇到了此错误消息,同时编译了与“虚拟地球仪的 3D 引擎设计”一书 ( http://www.virtualglobebook.com ) 相关的一些示例代码。

这是原始片段着色器行:
fragmentColor = mix(vec3(0.0, intensity, 0.0), vec3(intensity, 0.0, 0.0), (distanceToContour < dF));

解决方案是将有问题的布尔表达式转换为浮点数,如下所示:
fragmentColor = mix(vec3(0.0, intensity, 0.0), vec3(intensity, 0.0, 0.0), float(distanceToContour < dF));

混合手册(http://www.opengl.org/sdk/docs/manglsl)指出

对于 a 为 genBType 的 mix 的变体,a[i] 为假的元素,该元素的结果取自 x,而 a[i] 为真,则取自 y。

因此,由于编译器应该接受布尔混合值而不加注释,我认为这应该归结为 AMD/ATI 驱动程序问题。

于 2013-10-22T21:59:51.930 回答