-
-
Notifications
You must be signed in to change notification settings - Fork 903
Open
Description
pyxel/rust/pyxel-engine/src/graphics.rs
Lines 432 to 448 in 583f39f
let texture_format = if pyxel_platform::gl_profile() == GLProfile::Gles { | |
glow::LUMINANCE | |
} else { | |
glow::RED | |
}; | |
gl.tex_image_2d( | |
glow::TEXTURE_2D, | |
0, | |
texture_format as i32, | |
self.width as i32, | |
self.height as i32, | |
0, | |
texture_format, | |
glow::UNSIGNED_BYTE, | |
PixelUnpackData::Slice(Some(&self.screen.lock().canvas.data)), | |
); |
GLProfile::Glの場合にglTexImage2Dのinternalformat
引数にGL_REDを渡していますが、GL_REDを渡すと精度をドライバーが決定してしまうため引数(internalformat
, format
, type
)の組み合わせが(GL_LUMINANCE
, GL_LUMINANCE
, GL_UNSIGNED_BYTE
)のとき、L成分一つのみを持ち精度は8 bitとなるGL_LUMINANCEとの互換性を失うため、この場合GL_R8を渡す必要があります。また、最適化が効かなくなる可能性もあります。
この問題はinternalformat
引数にsized internal formatを渡せなかった古いOpenGLの欠陥でGL_LUMINANCEの代わりにGL_REDを使用する場合は引数(internalformat
, format
, type
)の組み合わせを(GL_R8
, GL_RED
, GL_UNSIGNED_BYTE
)とするのがおまじないの定型文です。ただし、sized internal formatを使用できるバージョンか調べて場合分けする必要があるかもしれません。固定機能のころはGL_LUMINANCE8, GL_LUMINANCE_ALPHA16があったのですが廃止されました。
OpenGL Common Mistakesに同根の問題が説明されています。
Metadata
Metadata
Assignees
Labels
No labels