c++ - OpenGL 变换反馈不返回任何东西

标签 c++ opengl transform-feedback

我正在开展一个项目,通过使用几何着色器和变换反馈来创建几何。

我目前正在尝试让几何着色器在不更改/添加任何内容的情况下返回其输入(1 个三角形),但它不起作用。

如果我能得到任何帮助/建议,我将不胜感激。以下是我的部分代码:

转换反馈计划的创建:

//==========================================
// Create the Transform Program
//==========================================

int check = LoadShader("Shaders//transformVS.glsl", GL_VERTEX_SHADER, transformVS);

//TODO: check for fail

check = LoadShader("Shaders//transformGS.glsl", GL_GEOMETRY_SHADER, transformGS);

//TODO: check for fail

transformProgram = glCreateProgram();

glAttachShader(transformProgram, transformVS);
glAttachShader(transformProgram, transformGS);

glBindAttribLocation(transformProgram, 0, "position_in");
glBindAttribLocation(transformProgram, 1, "normal_in");
glBindAttribLocation(transformProgram, 2, "length_in");

static const char* varyings[] = { "position_out", "normal_out", "length_out" };
glTransformFeedbackVaryings(transformProgram, 3, varyings, GL_INTERLEAVED_ATTRIBS);

glLinkProgram(transformProgram);

if (CheckProgram(transformProgram) == -1){
    glDetachShader(transformProgram, transformVS);
    glDetachShader(transformProgram, transformGS);
    glDeleteShader(transformVS);
    transformVS = 0;
    glDeleteShader(transformGS);
    transformGS = 0;
    glDeleteProgram(transformProgram);
    transformProgram = 0;

    return -1;
}

error = glGetError();

VBO、VAO 和 TFO 的创建:

//=====================================
// Create VBOs
//=====================================

glGenBuffers(2, VBOID);

glBindBuffer(GL_ARRAY_BUFFER, VBOID[0]);
glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(TVertex_VNL), vertices, GL_DYNAMIC_COPY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

error = glGetError();

glBindBuffer(GL_ARRAY_BUFFER, VBOID[1]);
glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(TVertex_VNL), NULL, GL_DYNAMIC_COPY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

error = glGetError();

//=====================================
// Create VAOs
//=====================================

glGenVertexArrays(2, VAOID);

glBindVertexArray(VAOID[0]);
    glBindBuffer(GL_ARRAY_BUFFER, VBOID[0]);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex_VNL), BUFFER_OFFSET(0)); //position
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex_VNL), BUFFER_OFFSET(sizeof(float) * 3)); //normal
    glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, sizeof(TVertex_VNL), BUFFER_OFFSET(sizeof(float) * 6)); //length
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
glBindVertexArray(0);

error = glGetError();

glBindVertexArray(VAOID[1]);
    glBindBuffer(GL_ARRAY_BUFFER, VBOID[1]);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex_VNL), BUFFER_OFFSET(0)); //position
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex_VNL), BUFFER_OFFSET(sizeof(float) * 3)); //normal
    glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, sizeof(TVertex_VNL), BUFFER_OFFSET(sizeof(float) * 6)); //length
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
glBindVertexArray(0);

error = glGetError();



//=====================================
// Create TFOs
//=====================================

glGenTransformFeedbacks(2, TFOID);

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, TFOID[0]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, VBOID[0]);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);

error = glGetError();

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, TFOID[1]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, VBOID[1]);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);

error = glGetError();

渲染方法:

//=========================================
// Clear Screen
//=========================================

//Clear all the buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

//========================================
// Transform Feedback
//========================================

glEnable(GL_RASTERIZER_DISCARD);

glUseProgram(transformProgram);

glBindVertexArray(VAOID[0]);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, TFOID[1]);

glBeginTransformFeedback(GL_TRIANGLES);

glDrawArrays(GL_TRIANGLES, 0, 3);

glEndTransformFeedback();

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);

glDisable(GL_RASTERIZER_DISCARD);

//========================================
// Draw Triangle
//========================================

//Bind the shader that we want to use
glUseProgram(renderProgram);

//Setup all uniforms for your shader
glUniformMatrix4fv(renderMVP, 1, FALSE, &MVP[0][0]);

//Bind the VAO
glBindVertexArray(VAOID[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);

//glDrawTransformFeedback(GL_TRIANGLES, TFOID[1]);

//========================================
// Swap Buffers
//========================================

glutSwapBuffers();

顶点着色器:

#version 330

in vec3 position_in;
in vec3 normal_in;
in float length_in;

out vec3 vs_position;
out vec3 vs_normal;
out float vs_length;

void main()
{
    vs_position = position_in;
    vs_normal = normal_in;
    vs_length = length_in;
}

几何着色器:

#version 330

layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;

in vec3 vs_position[];
in vec3 vs_normal[];
in float vs_length[];

out vec3 position_out;
out vec3 normal_out;
out float length_out;

void main()
{
    for(int i = 0; i < 3; i++){
        position_out = vs_position[i];
        normal_out = vs_normal[i];
        length_out = vs_length[i];

        EmitVertex();
    }

    EndPrimitive();
}

最佳答案

您的几何着色器没有发射任何顶点,因为从未进入 for 循环体:

for(int i = 0; i >= 3; i++){

关于c++ - OpenGL 变换反馈不返回任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32050667/

相关文章:

当窗口调整大小 3D 对象时,Java OpenGL 不保持大小

c++ - 几何着色器只创建一个图元

c++ - 如何通过转换类型指针将 char 数组转换为 uint16_t?

c++ - 将 boost::filtering_streambuf 与 newline_filter 一起使用时为空文件

c - 如何修复Glad.c中对符号 'dlclose@@GLIBC_2.2.5'的 undefined reference

java - Opengl 变换反馈在 Android 上正确制作

c++ - OpenGL 使用动态几何变换反馈

c++ - 在 2 个不同的类上计算创建的对象会导致问题

c++ - 短内联函数的 const 正确性是否重要?

opengl - 自由谷底 (./light) : ERROR: Internal error <FBConfig with necessary capabilities not found> in function fgOpenWindow