1
$\begingroup$

I`m drawing image with code in this example: Gpu Shader Module, 2D Image Example.

import bpy
import gpu
import bgl
from gpu_extras.batch import batch_for_shader

IMAGE_NAME = "Untitled"
image = bpy.data.images[IMAGE_NAME]

shader = gpu.shader.from_builtin('2D_IMAGE')
batch = batch_for_shader(
    shader, 'TRI_FAN',
    {
        "pos": ((100, 100), (200, 100), (200, 200), (100, 200)),
        "texCoord": ((0, 0), (1, 0), (1, 1), (0, 1)),
    },
)

if image.gl_load():
    raise Exception()


def draw():
    bgl.glActiveTexture(bgl.GL_TEXTURE0)
    bgl.glBindTexture(bgl.GL_TEXTURE_2D, image.bindcode)

    shader.bind()
    shader.uniform_int("image", 0)
    batch.draw(shader)


bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_PIXEL')

It looks much darker then same image drawn as camera background image or empty object.

Cant find a way to adjust its colorspace. Please help, thanks.

$\endgroup$
3
  • 1
    $\begingroup$ May be related docs.blender.org/api/blender2.8/… $\endgroup$
    – batFINGER
    Jul 11, 2019 at 16:55
  • $\begingroup$ Was trying to changle image.alpha_mode to: 'STRAIGHT', 'PREMUL', 'CHANNEL_PACKED', 'NONE'. No luck, no changes. Right now searching implementation of this constant: bgl.GL_FRAMEBUFFER_SRGB, trying to find how to use it. $\endgroup$ Jul 11, 2019 at 17:20
  • $\begingroup$ Unfortunatly, bgl.glEnable(bgl.GL_FRAMEBUFFER_SRGB) works for hole screen not only for texture. $\endgroup$ Jul 11, 2019 at 18:19

1 Answer 1

0
$\begingroup$

With

shader_code = gpu.shader.code_from_builtin("2D_IMAGE")
print(shader_code["vertex_shader"])
print(shader_code["fragment_shader"])

One can get code for builtin shader and modify it. Here is mine, just 2 lines changed version:

vertex_shader = '''

    uniform mat4 ModelViewProjectionMatrix;

    in vec2 texCoord;
    in vec2 pos;
    out vec2 texCoord_interp;

    void main()
    {
      gl_Position = ModelViewProjectionMatrix * vec4(pos.xy, 0.0f, 1.0f);
      gl_Position.z = 1.0;
      texCoord_interp = texCoord;
    }

'''
fragment_shader = '''
    in vec2 texCoord_interp;
    out vec4 fragColor;

    uniform float gamma;

    uniform sampler2D image;

    void main()
    {
      fragColor = pow(texture(image, texCoord_interp), vec4(gamma));
    }

'''

shader = gpu.types.GPUShader(vertex_shader, fragment_shader)
shader.uniform_float("gamma", .454)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.