我正在try 在OpenGL中渲染纹理.但是,纹理是完全黑色的.

纹理渲染在由2个三角形组成的屏幕大小的四边形上.三角形使用三角形扇形模式进行渲染.

如果有人能指出我代码中的问题,那将是非常有帮助的.

创建纹理:

 texture = gl.glGenTextures(1)
    gl.glActiveTexture(gl.GL_TEXTURE0)
    gl.glBindTexture(gl.GL_TEXTURE_2D, texture)

    gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
    gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)
    gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT);
    gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT);

    viewport = gl.glGetIntegerv(gl.GL_VIEWPORT)
    width = viewport[2]
    height = viewport[3]
    
    print(width, height)
    image = Image.open("./madeline.jpg").convert('RGB')
    data = np.array(image).flatten()


    #gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, width, height, 0, gl.GL_RGB, gl.GL_FLOAT, None)
    gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, 1920, 1080, 0, gl.GL_RGB, gl.GL_UNSIGNED_INT, data)
    gl.glBindTexture(gl.GL_TEXTURE_2D, texture)

顶点数据:

# vertex -> x, y, z, u, v
vertices = [

    -1, 1, 0, 0, 1,   # top-left
    1, 1, 0, 1, 1,   # top-right
    1, -1, 0, 1, 0,  # bottom-right
    -1, -1, 0, 0, 0  # bottom-left

    ]

设置缓冲区:

 # setup buffers
    vao = gl.glGenVertexArrays(1)
    vbo = gl.glGenBuffers(1)

    gl.glBindVertexArray(vao)

    gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vbo)
    gl.glBufferData(gl.GL_ARRAY_BUFFER, len(vertices) * floatSize, np.array(vertices, dtype="float32"), gl.GL_STATIC_DRAW)
    
    
    gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, 5 * floatSize, None)
    gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, gl.GL_FALSE, 5 * floatSize, 3 * floatSize)
    gl.glEnableVertexAttribArray(0)
    gl.glEnableVertexAttribArray(1)

    gl.glBindVertexArray(vao)

顶点明暗器:

#version 430 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 texCoord;

out vec2 tex;

void main() {

    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
    tex = texCoord;
}

片段着色器:

#version 430 core


out vec4 fragColour;
in vec2 tex;

uniform sampler2D ourTex;

void main(){

    fragColour = texture(ourTex, tex);
}

主循环:

while not glfwWindowShouldClose(window):
        gl.glClearColor(0.2, 0.3, 0.3, 1.0)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
    
    
        #gl.glDrawElements(gl.GL_TRIANGLES, 6, gl.GL_UNSIGNED_INT, 0)
        gl.glDrawArrays(gl.GL_TRIANGLE_FAN, 0, 4)

        glfwSwapBuffers(window)
        glfwPollEvents()

代码:https://github.com/RandomPigYT/raytracer

推荐答案

不能将图像对象直接加载到NumPy数组中.您必须使用Image.getdata检索图像的内容.图像数据的类型是GL_UNSIGNED_BYTE,我建议使用Image对象的size属性.

image = Image.open("./madeline.jpg").convert('RGBA')
data = np.array(list(image.getdata()), np.uint8)
width, height = image.size
gl.glTexImage2D(
    gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, width, height, 0,
    gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data)

您还可以使用Image.tobytes将图像作为字节对象返回.

image = Image.open("./madeline.jpg").convert('RGBA')
data = image.tobytes()
width, height = image.size
gl.glTexImage2D(
    gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, width, height, 0,
    gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data)

glVertexAttribPointer的最后一个参数是指针,而不是整数:

gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, gl.GL_FALSE, 5 * floatSize, 3 * floatSize)

gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, gl.GL_FALSE, 5 * floatSize, 
    ctypes.c_void_p(3 * floatSize))

Python相关问答推荐

如何计算两极打印机中 * 所有列 * 的出现次数?

为什么符号没有按顺序添加?

ODE集成中如何终止solve_ivp的无限运行

将tdqm与cx.Oracle查询集成

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

网格基于1.Y轴与2.x轴显示在matplotlib中

Maya Python脚本将纹理应用于所有对象,而不是选定对象

Pandas—堆栈多索引头,但不包括第一列

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

计算机找不到已安装的库'

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

如何反转一个框架中列的值?

如何用FFT确定频变幅值

以极轴表示的行数表达式?

使用xlsxWriter在EXCEL中为数据帧的各行上色

极点:在固定点扩展窗口

如何将验证器应用于PYDANC2中的EACHY_ITEM?

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError

如何在Polars中将列表中的新列添加到现有的数据帧中?

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";