Skip to content

Pyxel::bind_screen_texture内で指定されるテクスチャフォーマットの問題 #655

@tasogare3710

Description

@tasogare3710

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の場合にglTexImage2Dinternalformat引数に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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions