【问题标题】:glGetUniformLocation returning -1 during transform feedback when it is usedglGetUniformLocation 在使用时在变换反馈期间返回 -1
【发布时间】:2018-05-14 05:23:06
【问题描述】:

该函数返回 -1,即使在顶点着色器中定义和使用了 Uniform,我怀疑原因可能是 out 属性可能没有正确绑定到目标缓冲区(不确定是否是这种情况)。没有这件制服,我的大部分价值观都将保持不变。

绘制变换反馈

/*code included in update*/
glUseProgram(feedbackShader->GetProgram());

glEnable(GL_RASTERIZER_DISCARD);
/*end of code included in update*/

glBindBuffer(GL_ARRAY_BUFFER, particleBuffer[isEvenBuffer]);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformBuffer[!isEvenBuffer]);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
glEnableVertexAttribArray(5);

glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), 0); //Location
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), (const GLvoid*)12); //Velocity
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), (const GLvoid*)24); //InitLocation
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), (const GLvoid*)36); //InitVelocity
glVertexAttribPointer(3, 1, GL_FLOAT, GL_FALSE, sizeof(Particle), (const GLvoid*)48); //Lifetime
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, sizeof(Particle), (const GLvoid*)52); //InitLifetime

GLint uniformLocation = glGetUniformLocation(feedbackShader->GetProgram(), "time");

glUniform1f(uniformLocation, msec);

glBeginTransformFeedback(GL_POINTS);

glDrawTransformFeedback(GL_POINTS, transformBuffer[isEvenBuffer]);

glEndTransformFeedback();

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
glDisableVertexAttribArray(4);
glDisableVertexAttribArray(5);

顶点着色器

#version 410

in vec3 inLocation;
in vec3 inVelocity;
in vec3 inInitLocation;
in vec3 inInitVelocity;
in float inLifeTime;
in float inInitlifeTime;

out vec3 outLocation;
out vec3 outVelocity;
out vec3 outInitLocation;
out vec3 outInitVelocity;
out float outLifeTime;
out float outInitlifeTime;

uniform float time;

vec3 Gravity = vec3(0.0f,-0.98f,0.0f);
float dampeningFactor = 0.5;

void main()
{

  outLifeTime = inLifeTime - time;

  if(outLifeTime > 0.0f){
    outVelocity = (inVelocity + Gravity * time) * dampeningFactor;
    outLocation = inLocation + inVelocity * time;
  }else{
    outVelocity = inInitVelocity;
    outLocation = inInitLocation;
    outLifeTime = inInitlifeTime;
  }
  outInitVelocity = inInitVelocity;
  outInitLocation = inInitLocation;
  outInitlifeTime = inInitlifeTime;
}

更新 你们都要求提供一些额外的信息。

顶点着色器

#version 410

in vec3 inLocation;
in vec3 inVelocity;
in vec3 inInitLocation;
in vec3 inInitVelocity;
in float inLifeTime;
in float inInitlifeTime;

out vec3 outLocation;
out vec3 outVelocity;
out vec3 outInitLocation;
out vec3 outInitVelocity;
out float outLifeTime;
out float outInitlifeTime;

uniform float time;

vec3 Gravity = vec3(0.0f,-0.98f,0.0f);
float dampeningFactor = 0.5;

void main()
{

  outLifeTime = inLifeTime - time;

  if(outLifeTime > 0.0f){
    outVelocity = (inVelocity + Gravity * time) * dampeningFactor;
    outLocation = inLocation + inVelocity * time;
  }else{
    outVelocity = inInitVelocity;
    outLocation = inInitLocation;
    outLifeTime = inInitlifeTime;
  }
  outInitVelocity = inInitVelocity;
  outInitLocation = inInitLocation;
  outInitlifeTime = inInitlifeTime;
}

反馈变化(我很愚蠢,一开始没有这个问题,尽管我的代码中仍然存在同样的问题)

const GLchar* feedbackVaryings[] = {
    "outLocation",
    "outVelocity",
    "outInitLocation",
    "outInitVelocity",
    "outLifeTime",
    "outInitlifeTime"
};
glTransformFeedbackVaryings(feedbackShader->LinkProgram(), 6, feedbackVaryings, GL_INTERLEAVED_ATTRIBS);

我还在“绘制变换反馈部分”中添加了 gluseProgram。

【问题讨论】:

  • 这是一个变换反馈,所以不存在片段着色器。
  • 您在拨打glUniform1f 之前是否拨打过glUseProgram?我在您的代码中看不到它...
  • 你应该在统一之前绑定你的着色器,例如glUseProgram(feedbackShader->GetProgram())GLint uniformLocation = glGetUniformLocation(feedbackShader->GetProgram(), "time");
  • @Rabbid76 feedbackShader 变量清楚地表明程序已经链接。不用再链接了,他可以简单的通过绑定shader/使用程序id来获取位置
  • @Rabbid76 我明白你的意思,在这种情况下,OP 应该包含其着色器的详细信息,然后我们可以查看实现细节并从那里继续

标签: opengl glsl transform-feedback


【解决方案1】:

我假设指令

feedbackShader->LinkProgram()

链接程序。但是在链接程序之前必须指定变化的变换反馈变量。

OpenGL 4.6 API Core Profile Specification; 7.3.1.1 Naming Active Resources; page 104

活动资源列表的顺序取决于所有的实现 TRANSFORM_FEEDBACK_VARYING 以外的接口。如果变量在 TRANSFORM_FEEDBACK_VARYING 接口是使用TransformFeedbackVaryings 命令指定的,活动资源列表将按照指定的可变顺序排列在最近一次调用TransformFeedbackVaryings 之前,最后一次调用LinkProgram

这意味着,首先您必须将已编译的顶点着色器对象附加到程序对象 (glAttachShader)。然后你必须指定变换反馈变化(glTransformFeedbackVaryings)。最后你必须链接程序(glLinkProgram):

GLuint shader_obj;
GLuint program_obj;

.....

glAttachShader(program_obj, shader_obj);

const GLchar* feedbackVaryings[] = {
    "outLocation",
    "outVelocity",
    "outInitLocation",
    "outInitVelocity",
    "outLifeTime",
    "outInitlifeTime"
};
glTransformFeedbackVaryings(program_obj, 6, feedbackVaryings, GL_INTERLEAVED_ATTRIBS);

glLinkProgram(program_obj);



另外我推荐使用Layout Qualifier 来定义顶点shaser 输入变量的属性索引。

例如

layout (location = 0) in vec3 inLocation;
layout (location = 1) in vec3 inVelocity;
layout (location = 2) in vec3 inInitLocation;
layout (location = 3) in vec3 inInitVelocity;
layout (location = 4) in float inLifeTime;
layout (location = 5) in float inInitlifeTime;

属性索引也可以由glGetAttribLocation链接程序或由glBindAttribLocation链接程序之前设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多