2011-04-06 46 views
5

Belirli ATI kartlarında (Radeon X1650, X1550 + ve diğerleri) zor bir sorun yaşıyorum.GlGetTexImage (atioglxx.dll) çağrılırken hata oluştu

mesajı şöyledir: "adresinin 00000000 arasında okuyun 'atioglxx.dll' modülünde adresinde 6959DD46 de Erişim ihlali"

Bu hat üzerinde olur

:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P); 

Not:

  • En son grafik sürücüleri yüklüdür.
  • Diğer kartlarda mükemmel çalışır. işaretçi P geçerlidir

    • Bu ve
    • Tekstüre etkinleştirildiğinde görüntü tutmak için yeterli bellek tahsis: Burada

  • I (kodunda iddialar ile) şimdiye kadar denedim budur: glIsEnabled (GL_TEXTURE_2D) güncel bağlanmış doku beklemek biri olduğunu
  • Testi: glGetIntegerv (GL_TEXTURE_2D_BINDING) güncel bağlanmış doku beklemek boyutlara sahip olduğu
  • Testi: glGetTexLevelParameteriv (GL_TEXTURE_WI DTH/YÜKSEKLİK) hiç hata rapor edildiğini
  • Testi: glGetError'da

Tüm bu testi geçer ve daha sonra hala iletiyle başarısız olur.

Her şeyi denediğimi ve daha fazla fikrim olmadığını hissediyorum. Umarım burada bazı GL-guru yardımcı olabilir!

DÜZENLEME: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=295137#Post295137

Ben de GL_PACK_ALIGNMENT çalıştı ve yardım etmedi:

sonra muhtemelen ben de burada bu konuda yayınlanan bir sürücü hata olduğunu sonucuna vardı.

Daha fazla araştırma yaparak, yalnızca daha önce glCopyTexSubImage2D çağrısı kullanarak piksellerle doldurduğum dokularda olduğunu gördüm. Bu nedenle glCopyTexSubImage2d çağrısını glReadPixels ve ardından glTexImage2D çağrıları ile değiştirerek bir geçici çözüm üretebilirim. Sen GL_PACK_ALIGNEMENT özen olabilir

{ 
    glCopyTexSubImage2D cannot be used here because the combination of calling 
    glCopyTexSubImage2D and then later glGetTexImage on the same texture causes 
    a crash in atioglxx.dll on ATI Radeon X1650 and X1550. 
    Instead we copy to the main memory first and then update. 
} 
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, PixelWidth, PixelHeight); //** 
GetMem(P, PixelWidth * PixelHeight * 4); 
glReadPixels(0, 0, PixelWidth, PixelHeight, GL_RGBA, GL_UNSIGNED_BYTE, P); 
SetMemory(P,GL_RGBA,GL_UNSIGNED_BYTE); 
+2

Sürücü hatası gibi görünüyor. ATI'nin OpenGL sürücüleri istikrar açısından kötü bir üne sahiptir. Birçok program tarafından kullanılmayan özellikler bozulabilir. Doku görüntüsünü almak, nadiren kullanılan bir özelliktir. Başarısızlığın olası tüm nedenlerini zaten ortadan kaldırdığınıza göre, bunu AMD/ATI'ye bir hata olarak bildirmenizi öneririm. – datenwolf

+0

Teşekkürler, opengl.org forum forumuna mesaj göndereceğiz. Orada birkaç AMD mühendisinin faaliyeti var gibi görünüyor. Tüm doğru şeyleri denemek ve bunları sorunuzda listelemek için –

+1

+1. Sürücü hatası gibi geldiğini kabul ediyorum. Bir ATI geliştiricisinden bir şey duyarsanız bu soruyu güncellediğinizden emin olun :) – luke

cevap

1

:

İşte benim güncellenmiş koddur. Bu parametre dokuyu paketlemek için size en yakın bayt sayısını söylemiştir. Yani, 645 piksellik bir görüntü varsa:

  • GL_PACK_ALIGNEMENT ile 4 (varsayılan değer) olarak, 648 piksele sahip olacaksınız.
  • 1'e kadar GL_PACK_ALIGNEMENT ile 645 piksele sahip olacaksınız.() Sizin glGetTexImage önce

    glPixelStorei(GL_PACK_ALIGNMENT, 1) 
    

    veya GL_PACK_ALIGNEMENT üzerinde bellek dokusunu align:

Yani paket değeri yaparak Tamam olduğundan emin olun.

0

Bu büyük olasılıkla bir sürücü hatasıdır. 3D apis yazdığımda, nasıl olduğunu görmek bile kolay. Gerçekten garip ve test edilmesi gereken nadir bir şey yapıyorsunuz: Yükleme sırasında float verilerini 8 bit'e dönüştürün. Kimse bu yolu optimize etmeyecek. İlk etapta ne yaptığınızı tekrar gözden geçirmelisiniz. Genel dönüşüm cpu dönüştürme işlevi muhtemelen oraya başlıyor ve birisi bunun için geçici tamponların dağıtımını gerçekleştiren bir tabloyu karıştırdı. Dahili bir 8 bit formatıyla harici bir float formatı kullanmayı düşünmelisiniz. GL api'deki gibi dönüşümler genellikle programlama hatalarına işaret eder. Eğer veri yüzer ve bu şekilde tutmak istiyorsanız, float doku kullanmalı ve RGBA kullanmamalısınız. 8 bit istiyorsan, girişin neden yüzüyor?

+0

Genel olarak size katılıyorum ama glGetTexImage bir tip parametresi aldığından, bu işlevin birim testleri ile kolayca örtülmelidir. Ayrıca formatı sabit tutmak için test ettim (GL_FLOAT tamamen) ama hata kaldı. Bu, glCopyTexSubImage2D ve ardından hataya neden olan glGetTexImage'ın özel birleşimi idi. –

+0

Aslında asıl gönderiyi yanlış okuyorum ve Get in glGetTexImage öğesini görmedim. Bu işlev sadece oldukça hata ayıklama olarak kabul edilir. Prensipte ünite testleri konusunda haklısınız fakat gl api o kadar büyük ki gerçekten mümkün değil. 20 dahili format, 20 harici, 20 durum. Yükle, kopyala, indir, harita. Sadece birçok kombinasyon için. Ve hem kopyala hem al, saçma özellikler. – starmole