gpt4 book ai didi

c++ - 如何更新 GLSL 中的统一变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:10 25 4
gpt4 key购买 nike

我试图从我的应用程序更新我的着色器中的眼睛位置,但是当我尝试这样做时,我一直收到错误 1281。初始化后我没有问题,就在我随后尝试更新值时。这是我的代码:

void GraphicsObject::SendShadersDDS(char vertFile [], char fragFile [], 字 rune 件名 []){

            char *vs = NULL,*fs = NULL;

vert = glCreateShader(GL_VERTEX_SHADER);
frag = glCreateShader(GL_FRAGMENT_SHADER);

vs = textFileRead(vertFile);
fs = textFileRead(fragFile);
const char * ff = fs;
const char * vv = vs;

glShaderSource(vert, 1, &vv, NULL);
glShaderSource(frag, 1, &ff, NULL);

free(vs); free(fs);

glCompileShader(vert);
glCompileShader(frag);

program = glCreateProgram();
glAttachShader(program, frag);
glAttachShader(program, vert);

glLinkProgram(program);
glUseProgram(program);

LoadCubeTexture(filename, compressedTexture);

GLint location = glGetUniformLocation(program, "tex");
glUniform1i(location, 0);
glActiveTexture(GL_TEXTURE0);

EyePos = glGetUniformLocation(program, "EyePosition");

glUniform4f(EyePos, EyePosition.X(),EyePosition.Y(),
EyePosition.Z(), 1.0);
DWORD bob = glGetError();
//All is fine here
glEnable(GL_DEPTH_TEST);

这是我调用来更新眼睛位置的函数:

void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition){

glUniform4f(EyePos, eyePosition.X(),eyePosition.Y(), 
eyePosition.Z(), 1.0);

DWORD bob = glGetError();
//bob equals 1281 after this call

我已经尝试了几种更新变量的方法,这是最新的版本,感谢观看,欢迎大家提出意见。

更新:错误实际上根本没有发生在这里,我假设它是错误的,错误实际上发生在我绘制一些 Spring 时:

for(int i = 0; i < 2; i++) {

        springs[i].Draw();

}

当我绘制第一个时它很好,但在调用 glEnd() 以响应 glBegin(GL_LINE_STRIP) 时调用第二个时出现错误。很抱歉给您带来不便,因为这不是我发布的错误,但至少如果有人想知道如何更新统一变量,那么它就在这里。

最佳答案

这很有可能是EyePos无效造成的。

如果将函数更改为以下内容会怎样?

void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition)
{
EyePos = glGetUniformLocation(program, "EyePosition");
glUniform4f(EyePos, eyePosition.X(),eyePosition.Y(), eyePosition.Z(), 1.0);

DWORD bob = glGetError();
}

编辑:为了响应您的更新,glBegin/glEnd 的文档说如果模式设置为 Not Acceptable 值,您将收到错误 1280 (GL_INVALID_ENUM)。因此,您的问题是不支持 GL_LINE_STRIP。

GL_INVALID_OPERATION is generated if glBegin is executed between a glBegin and the corresponding execution of glEnd.

GL_INVALID_OPERATION is generated if glEnd is executed without being preceded by a glBegin.

GL_INVALID_OPERATION is generated if a command other than glVertex, glColor, glSecondaryColor, glIndex, glNormal, glFogCoord, glTexCoord, glMultiTexCoord, glVertexAttrib, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, glEdgeFlag, glCallList, or glCallLists is executed between the execution of glBegin and the corresponding execution glEnd.

GL_INVALID_OPERATION 返回错误 1282 和 GL_INVALID_ENUM 1280 ...所以很大程度上取决于您得到的确切错误...

关于c++ - 如何更新 GLSL 中的统一变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com