2010-03-25 17 views
6

Tôi đang cố gắng cập nhật vị trí mắt trong trình đổ bóng của tôi từ sự tán thành của tôi nhưng tôi vẫn nhận được lỗi 1281 khi tôi thử điều này. Tôi không có vấn đề gì sau khi khởi tạo chỉ khi tôi sau đó cố gắng cập nhật các giá trị. Đây là mã của tôi:Làm thế nào để cập nhật một biến thống nhất trong GLSL

trống GraphicsObject :: SendShadersDDS (char vertFile [], char fragFile [], char filename []) {

  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); 

}

Và đây là chức năng tôi gọi để cập nhật vị trí mắt:

void GraphicsObject :: UpdateEyePosition (Vector3d & eyePosition) {

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

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

}

Tôi đã thử một vài cách hiện nay của việc cập nhật biến và điều này là hiện thân mới nhất, nhờ để xem, tất cả các ý kiến ​​hoan nghênh.

UPDATE: Các lỗi không thực sự xảy ra ở đây cả, lỗi của tôi cho giả định đó là, lỗi thực sự xảy ra khi tôi rút ra một số mùa xuân:

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

 springs[i].Draw(); 

} 

khi tôi vẽ cái đầu tiên đó là tốt nhưng tôi nhận được một lỗi khi gọi thứ hai tại điểm mà gọi glEnd() để đáp ứng với glBegin (GL_LINE_STRIP). Xin lỗi vì sự bất tiện vì nó không phải là lỗi tôi đã đăng nhưng ít nhất nếu có ai muốn biết cách cập nhật các biến thống nhất thì nó ở đây.

Trả lời

4

Rất có thể điều này là do thực tế EyePos không hợp lệ.

Điều gì sẽ xảy ra nếu bạn thay đổi chức năng như sau?

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

    DWORD bob = glGetError(); 
} 

Edit: Để đối phó với cập nhật của bạn các tài liệu cho glBegin/glEnd nói rằng bạn sẽ nhận được lỗi 1280 (GL_INVALID_ENUM) nếu chế độ được thiết lập để một giá trị không thể chấp nhận. Do đó, vấn đề của bạn là GL_LINE_STRIP không được hỗ trợ.

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 trả về lỗi 1282 và GL_INVALID_ENUM 1280 ... Vì vậy, rất nhiều phụ thuộc vào những gì báo lỗi chính xác bạn đang nhận được ...

+0

tôi vẫn nhận được một lỗi, tôi đã làm điều đó để bắt đầu với. – paj777

+0

Bạn gặp phải lỗi gì? Và lỗi này có xuất phát từ glGetUniformLocation hay glUniform4f không? – Goz

+0

Giá trị EyePos là bao nhiêu? – Bahbar

Các vấn đề liên quan