VapeLord wrote:OpenGL works, otherwise Blender would not start. My graphics card (Radeon HD 7690m xt) supports up to OpenGL 4.1.
Faulty logic. See Aranuvir's step 3 to be sure the required dependencies are really installed.
Moderator: joepal
VapeLord wrote:OpenGL works, otherwise Blender would not start. My graphics card (Radeon HD 7690m xt) supports up to OpenGL 4.1.
This is now a comprehensible instruction. It should go into the Wiki.
import glfw
from OpenGL.GL import *
import numpy as np
import ctypes
import sys
shaderPath = 'basic.shaders'
def readShaders(path:str):
shaders = {'vertex': '',
'fragment': ''}
mode = None
with open(path, 'r', encoding='utf-8') as f:
for line in f:
if 'VertexShader' in line:
mode = 'vertex'
continue
elif 'FragmentShader' in line:
mode = 'fragment'
continue
if mode:
shaders[mode] += line
return shaders['vertex'], shaders['fragment']
def compileShader(t:int, source:str)->int:
id = glCreateShader(t)
glShaderSource(id, source)
glCompileShader(id)
result = glGetShaderiv(id, GL_OBJECT_COMPILE_STATUS)
if result == GL_FALSE:
log = glGetShaderInfoLog(id)
_t = 'vertex' if t == GL_VERTEX_SHADER else 'fragment'
print('Failed to compile {} shader!\n{}'.format(_t, log))
glDeleteShader(id)
return 0
return id
def createShader(vertexShader: str, fragmentShader: str) -> int:
program = glCreateProgram()
vs = compileShader(GL_VERTEX_SHADER, vertexShader)
fs = compileShader(GL_FRAGMENT_SHADER, fragmentShader)
glAttachShader(program, vs)
glAttachShader(program, fs)
glLinkProgram(program)
glValidateProgram(program)
validation = glGetProgramiv(program, GL_VALIDATE_STATUS)
if validation == GL_FALSE:
print('ERROR')
glDeleteShader(vs)
glDeleteShader(fs)
return program
def main():
if not glfw.init():
return
window = glfw.create_window(640, 480, 'Hello World', None, None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
print(f'Python : {sys.version}')
print(f'Numpy : {np.version.version}')
gl_version = glGetString(GL_VERSION)
print(f'GL Version : {str(gl_version, encoding="utf-8")}')
positions = np.array([-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0], dtype=np.float32)
colors = np.array([1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0], dtype=np.float32)
v_source, f_source = readShaders(shaderPath)
shader = createShader(v_source, f_source)
v_buffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, v_buffer)
glBufferData(GL_ARRAY_BUFFER, positions.nbytes, positions, GL_STATIC_DRAW)
attr_pos = glGetAttribLocation(shader, 'a_position')
glEnableVertexAttribArray(attr_pos)
glVertexAttribPointer(attr_pos, 3, GL_FLOAT, GL_FALSE, 0, ctypes.c_void_p(0))
c_buffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, c_buffer)
glBufferData(GL_ARRAY_BUFFER, colors.nbytes, colors, GL_STATIC_DRAW)
attr_col = glGetAttribLocation(shader, 'a_color')
glEnableVertexAttribArray(attr_col)
glVertexAttribPointer(attr_col, 4, GL_FLOAT, GL_FALSE, 0, ctypes.c_void_p(0))
glUseProgram(shader)
while not glfw.window_should_close(window):
glClear(GL_COLOR_BUFFER_BIT)
glDrawArrays(GL_TRIANGLES, 0, 3)
glfw.poll_events()
glfw.swap_buffers(window)
glDeleteProgram(shader)
glfw.terminate()
if __name__ == '__main__':
main()
#VertexShader
#version 330
in vec4 a_position;
in vec4 a_color;
out vec4 v_color;
void main()
{
gl_Position = a_position;
v_color = a_color;
}
#FragmentShader
#version 330
in vec4 v_color;
out vec4 out_color;
void main()
{
out_color = v_color;
}
VapeLord wrote:@RobBear
@Aranuvir
i have tried the basic.shaders as both .py and .txt Both times the same error.
shaderPath = 'basic.shaders'
shaderPath = 'basic.txt'
Return to Bugs, problems and feature requests
Users browsing this forum: No registered users and 2 guests