2012-02-21 5 views
5

Tôi đang sử dụng OpenGL và GLSL để vẽ kết cấu trên một lưới đơn giản.glUniform không đặt giá trị mẫu

Vấn đề của tôi là khi tôi đang sử dụng glUniform1i để đặt giá trị của đồng phục sampler2D, nó chưa được đặt. Ví dụ: trong mã này:

glUseProgram(programObject); 

glUniform1i(glGetUniformLocation(programObject, "texture"), 1); 
GLint val; 
glGetUniformiv(programObject, 
       glGetUniformLocation(programObject, "texture"), 
       &val); 
printf("Value is %d\n", val); 

Giá trị được in ở dòng lệnh là 0. Tôi đã kiểm tra xem các trình biên dịch có được biên dịch chính xác và chương trình được liên kết chính xác hay không. glGetUniformLocation xuất ra chỉ mục> 0. Hơn nữa, glGetError không xuất ra bất kỳ lỗi nào tại bất kỳ thời điểm nào.

Điều này chỉ xảy ra khi đồng phục là mẫu thử. Vì texture không được thiết lập, quering nó trong shader luôn luôn trả về (0, 0, 0, 1). (Tôi cũng đã kiểm tra, sử dụng apitrace, kết cấu của tôi được gắn chính xác đến GL_TEXTURE1, được thực hiện ngay sau khi mã được hiển thị).

Tôi đã tìm kiếm rộng rãi về vấn đề này và tôi chỉ tìm thấy một ví dụ tương tự như here này. Giải pháp là để khởi tạo GLEW, nhưng điều này đã không làm việc cho tôi.

Tôi rất sẵn lòng cung cấp mọi thông tin mở rộng cần thiết (hoặc dấu vết từ apitrace).

Sửa

Đây là shader:

uniform sampler2D texture; 

varying vec2 textureCoord; 

void main() { 
    gl_FragColor = texture2D(texture, textureCoord); 
} 

Giải pháp

tôi quản lý để giải quyết vấn đề sau khi một số công việc.

Khi nó quay ra, vấn đề này không phải là do bộ đồng phục không được thiết lập, vì luôn luôn trả về 0 cho các trình lấy mẫu bất kể giá trị thực tế có vẻ như là một hoạt động không thực hiện. Điều này xảy ra dưới sự điều khiển của Intel cho Sandy Bridge. Kiểm tra mã dưới các triển khai khác luôn trả về giá trị mẫu chính xác.

Vấn đề về kết cấu trả về (0, 0, 0, 1) luôn do lỗi tôi tạo ra trong quá trình tạo kết cấu.

Bây giờ, glGerUniformiv vẫn trả về 0, nhưng kết cấu được sử dụng là đúng.

+0

Bạn cũng nên đăng trình đổ bóng. –

+2

Bạn đã thử đặt tên cho nó một cái gì đó khác (kết cấu cũng là một hàm GLSL tích hợp, trong khi về mặt kỹ thuật không phải là từ khóa tôi sẽ không đảm bảo điều này sẽ hoạt động). – KillianDS

+0

Tôi đã thử đổi tên bộ đồng phục thành "myTexture" nhưng không may là kết quả cũng giống nhau. – fescrb

Trả lời

3

Giải pháp

tôi quản lý để giải quyết vấn đề sau khi một số công việc.

Khi nó quay ra, vấn đề này không phải là do bộ đồng phục không được thiết lập, vì luôn trả về 0 cho các trình lấy mẫu bất kể giá trị thực tế có vẻ như là một sự lừa đảo của việc thực hiện gl. Điều này xảy ra dưới sự điều khiển của Intel cho Sandy Bridge. Kiểm tra mã dưới các triển khai khác luôn trả về giá trị mẫu chính xác.

Vấn đề về kết cấu trả về (0, 0, 0, 1) luôn do lỗi tôi tạo ra trong quá trình tạo kết cấu.

Bây giờ glGerUniformiv vẫn trả về 0, nhưng kết cấu được sử dụng là đúng.