我在glvertexattributepointer上出错,可能是因为该值或任何(?)有人知道如何解决这个问题吗?
import glfw
from OpenGL.GL import *
import OpenGL.GL.shaders
import numpy as np
from PIL import Image
def main():
if not glfw.init():
return
window = glfw.create_window(720, 720, "08_A_xxx: PyOpengl dan tekstur", None, None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
#posisi warna koordinat tekstur
rectangle = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,
0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0,
0.5, 0.5, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0,
-0.5, 0.5, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0]
# ubah ke 32 bit (float)
rectangle = np.array(rectangle, dtype=np.float32)
indices = [0,1,2,
2,3,0]
indices = np.array(indices, dtype = np.uint32)
VERTEX_SHADER = """
#version 330
in vec3 position;
in vec3 color;
in vec2 InTexCoords;
out vec3 newColor;
out vec2 OutTexCoords;
void main() {
gl_Position = vec4(position, 1.0);
newColor = color;
OutTexCoords = InTexCoords;
}
"""
FRAGMENT_SHADER = """
#version 330
in vec3 newColor;
in vec2 OutTexCoords;
out vec4 outColor;
uniform sampler2D samplerTex;
void main() {
outColor = texture(samplerTex, OutTexCoords);
}
"""
# Kompilasi program dan shaders
shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(VERTEX_SHADER, GL_VERTEX_SHADER),
OpenGL.GL.shaders.compileShader(FRAGMENT_SHADER, GL_FRAGMENT_SHADER))
# Buat objek buffer dalam gpu
VBO = glGenBuffers(1)
# Bind the buffer
glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, 128, rectangle, GL_STATIC_DRAW)
# Buat EBO
EBO = glGenBuffers(1)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW)
# mendapatkan posisi dari shader
position = glGetAttribLocation(shader, 'position')
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(0))
glEnableVertexAttribArray(position)
# mendapatkan warna dari shader
color = glGetAttribLocation(shader, 'color')
glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(12))
glEnableVertexAttribArray(color)
texCoords = glGetAttribLocation(shader, "InTexCoords")
glVertexAttribPointer(texCoords,2, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(24))
glEnableVertexAttribArray(texCoords)
# Buat Tekstur
texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texture)
# texture wrapping params
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
# texture filtering params
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
image = Image.open("hello.jpg")
img_data = np.array(list(image.getdata()), np.uint8)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, img_data)
glUseProgram(shader)
glClearColor(0.0, 0.0, 0.0, 1.0)
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT)
# Gambar segiempat
glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_INT, None)
glfw.swap_buffers(window)
glfw.terminate()
if __name__ == "__main__":
main()
属性颜色不是活动的程序资源,因为该属性在着色器程序中未“使用”。该属性从顶点传递到片段着色器,但片段着色器忽略输入变量newColor。优化算法对属性进行排序
因此,glGetAttributeLocation返回-1,最后glVertexAttributePointer失败。
无需为属性颜色指定顶点属性数据数组,因为根本不需要该数组。如果glGetAttribLocation返回的值大于或等于0,请进行评估,以解决问题:
color = glGetAttribLocation(shader, 'color')
if color >= 0:
glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(12))
glEnableVertexAttribArray(color)
我被告知从其他stackoverflow帖子将遗留配置文件切换到核心配置文件,但我似乎找不到这样做的方法。所以我假设一个更新的错误帖子来帮助我找到一个方法。 代码: 我一直收到这个错误 回溯(最近一次调用): 我似乎找不到任何方法来解决这个问题。我是OpenGL/PyOpenGL新手,找不到任何提出大致相同问题的帖子
Python中要访问OpenGL函数必须加上一个PyOpenGL包。
因此,我们有两条glVertexAttribPointer线,因为我们在顶点着色器中定义了两个变量。所以基本上我们定义了这两个变量所指向的。因此,第一个glVertexAttribPointer定义第一个变量“position”是一个顶点,每个顶点有三个浮动坐标。第二个glVertexAttribPointer定义了第二个变量“texcoord”,它是一对纹理坐标,每个坐标都是浮动的。所以,如果到
我正在尝试将一个OpenGLES代码移植到OpenGL,但我对GlvertexatTribPointer有点困惑。下面是OpenGLES代码的一部分: 那么如何使用OpenGL创建缓冲区呢?因为在OpenGLES中,顶点是直接从glVertexAttribArray函数中的当前数组缓冲区中获取的。我尝试使用glBufferData,但它不起作用。
当我通过LWJGL学习OpenGL时,我一直在浏览LWJGL wiki上的教程。具体来说,这个。 我的问题是,尽管我已经复制了该代码、调用调用、函数对函数,但需要切换两个顶点属性指针(所以代码如下所示: 将其切换为位置索引为1而颜色索引为0,可以像预期的那样进行很好的渐变渲染。但是,如果我在切换索引的情况下运行它(我认为它应该工作的方式,我得到了这个: 显然,在研究了一段时间后,位置和颜色数据已经
我想渲染一个由许多立方体组成的大场景。我的第一个想法是创建一个立方体VBO,然后使用统一的模型矩阵多次绘制它来转换它。这很慢,因为我在每帧调用很多次。 所以我决定用一个巨大的VBO来代替每个立方体顶点和一个额外的平移向量。基本上,我使用我的旧通用多维数据集VBO加上转换向量,并将该列表附加到我想要绘制的每个多维数据集的VBO列表中。然后我绑定一个VAO并绘制它。我还更改了顶点着色器,使其接受该平移