首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多维数据集没有在OpenGL中呈现

多维数据集没有在OpenGL中呈现
EN

Stack Overflow用户
提问于 2013-10-26 17:43:43
回答 2查看 1.1K关注 0票数 0

我试图用着色器、缓冲区等绘制一个立方体,编写一个基本的OpenGL 3.3程序。问题是没有绘制多维数据集。很抱歉出现了这么多代码,但我觉得错误可能在任何地方,因为在我看来,这一切似乎都是正确的:显示函数是循环的,着色器是编译的,矩阵被传递给着色器。我怀疑淘汰可能有问题。请看一下。下面是代码(我使用freeglut,首先调用init(),然后在循环中显示运行):

初始化代码:

代码语言:javascript
运行
复制
struct ProgramData
{
    GLuint theProgram;
    GLuint iModel;
    GLuint iView;
    GLuint iProjection;
};

ProgramData shaderProgram;

ProgramData LoadProgram(const std::string &strVertexShader, 
                        const std::string &strFragmentShader)
{
    std::vector<GLuint> shaderList;

    shaderList.push_back(LoadShader(GL_VERTEX_SHADER, strVertexShader));
    shaderList.push_back(LoadShader(GL_FRAGMENT_SHADER, strFragmentShader));

    ProgramData data;
    data.theProgram = CreateProgram(shaderList);
    data.iModel = glGetUniformLocation(data.theProgram, "mModel");
    data.iView = glGetUniformLocation(data.theProgram, "mView");
    data.iProjection = glGetUniformLocation(data.theProgram, "mProjection");

    return data;
}

float cube_vertices[] = {
    -1.0f, -1.0f,  1.0f,
     1.0f, -1.0f,  1.0f,
     1.0f,  1.0f,  1.0f,
    -1.0f,  1.0f,  1.0f,
    -1.0f, -1.0f, -1.0f,
     1.0f, -1.0f, -1.0f,
     1.0f,  1.0f, -1.0f,
    -1.0f,  1.0f, -1.0f,

    GREEN_COLOR,
    BLUE_COLOR,
    RED_COLOR,
    BROWN_COLOR,

    GREEN_COLOR,
    BLUE_COLOR,
    RED_COLOR,
    BROWN_COLOR,
};

GLubyte cube_elements[] = {
     0,1,2, 2,3,0,   
     0,3,4, 4,5,0,
     0,5,6, 6,1,0,
     1,6,7, 7,2,1,
     7,4,3, 3,2,7,
     4,7,6, 6,5,4
};

void InitializeProgram()
{

    //initialize vertex buffer
    glGenBuffers(1, &vertex_buffer_obj);
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_obj);
    glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), 
                   cube_vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    //initialize index buffer
    glGenBuffers(1, &index_buffer_obj);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_obj);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_elements), 
                           cube_elements, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    shaderProgram = LoadProgram("shader.vert", "shader.frag");
}

void init()
{
    InitializeProgram();

    int numberOfVertices = 8;
    size_t color_data_offset = sizeof(float) * 3 * numberOfVertices;

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_obj);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 
                          (void*)color_data_offset);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_obj);
    glBindVertexArray(0);


    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glFrontFace(GL_CW);

    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0f, 1.0f);

}

顶点着色器:

代码语言:javascript
运行
复制
#version 330

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec3 color;

uniform mat4 mProjection;
uniform mat4 mView;
uniform mat4 mModel;

smooth out vec3 theColor;

void main()
{
    gl_Position = mProjection * mView * mModel * vec4(inPosition, 1);
    theColor = color;
}

碎片着色器:

代码语言:javascript
运行
复制
#version 330

smooth in vec3 theColor;
out vec4 outputColor;

void main()
{
    outputColor = vec4(theColor, 1);
}

绘制代码:

代码语言:javascript
运行
复制
glm::vec3 cam_pos(3, 2, 3);
void display()
{

glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(shaderProgram.theProgram);

glm::mat4 model_matrix = glm::translate(glm::vec3(0, 0, 0));
glm::mat4 view_matrix = glm::lookAt(cam_pos, 
                         glm::vec3(0, 0, 0), glm::vec3(0, 0, 1));
glm::mat4 proj_matrix = glm::perspective(45.0f, 1.0f, 1.0f, 100.0f);

glUniformMatrix4fv(shaderProgram.iProjection, 1, 
                       GL_FALSE, glm::value_ptr(proj_matrix));
glUniformMatrix4fv(shaderProgram.iView, 1, 
                       GL_FALSE, glm::value_ptr(view_matrix));
glUniformMatrix4fv(shaderProgram.iModel, 1, 
                       GL_FALSE, glm::value_ptr(model_matrix));

glBindVertexArray(vao);
int size;  glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, 
                                      GL_BUFFER_SIZE, &size);
glDrawElements(GL_TRIANGLES, size / sizeof(GLubyte), GL_UNSIGNED_SHORT, 0);

glBindVertexArray(0);
glUseProgram(0);

    glutSwapBuffers();
    glutPostRedisplay();
}

UPD:在init方法中,当计算颜色的偏移量应该是sizeof(float) * 3 * numberOfVertices而不是sizeof(GLubyte) * 3 * numberOfVertices时,颜色作为浮动存储。渲染问题没有解决。

解题:谢谢你的帮助。见下面的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-27 00:01:38

In display()函数

代码语言:javascript
运行
复制
glDrawElements(GL_TRIANGLES, size / sizeof(GLubyte), GL_UNSIGNED_SHORT, 0);

应改为

代码语言:javascript
运行
复制
glDrawElements(GL_TRIANGLES, size / sizeof(GLubyte), GL_UNSIGNED_BYTE, 0);

和init()

代码语言:javascript
运行
复制
glFrontFace(GL_CW);

代码语言:javascript
运行
复制
glFrontFace(GL_CCW);

所以问题是我传递给了OpenGL不正确的数据。索引数组是GLUbyte (每个数组元素的大小为1字节),但由于某种原因,我决定它是GLushort (2字节)。

编辑:不重要,但是向上向量(生成相机矩阵时)不应该是glm::vec3(0, 0, 1),而应该是glm::vec3(0, 1, 0)

票数 0
EN

Stack Overflow用户

发布于 2013-10-26 17:49:35

在浏览代码时,我注意到了顶点着色器中的一行代码:

代码语言:javascript
运行
复制
gl_Position = mProjection * mView * mModel * vec4(inPosition, 0);

0真的应该是一个1.0

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19609867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档