func loadTextures() (err error) { gl.GenTextures(textures) // Texture 1 textures[0].Bind(gl.TEXTURE_2D) if !glfw.LoadTexture2D(texturefiles[0], 0) { return errors.New("Failed to load texture: " + texturefiles[0]) } gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) // Texture 2 textures[1].Bind(gl.TEXTURE_2D) if !glfw.LoadTexture2D(texturefiles[0], 0) { return errors.New("Failed to load texture: " + texturefiles[0]) } gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // Texture 3 textures[2].Bind(gl.TEXTURE_2D) if !glfw.LoadTexture2D(texturefiles[0], glfw.BuildMipmapsBit) { return errors.New("Failed to load texture: " + texturefiles[0]) } gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR_MIPMAP_NEAREST) return }
func loadTextures() (err error) { gl.GenTextures(textures) //申请纹理处理 // Texture 1 textures[0].Bind(gl.TEXTURE_2D) //绑定将处理的纹理 if !glfw.LoadTexture2D(texturefiles[0], 0) { //加载纹理 return errors.New("Failed to load texture: " + texturefiles[0]) } /* LINEAR线性滤波的纹理贴图。这需要机器有相当高的处理能力,但它们看起来很不错。 我们接着要创建的第一种纹理使用 GL_NEAREST方式。从原理上讲,这种方式没有真正进行滤波。 它只占用很小的处理能力,看起来也很差。唯一的好处是这样我们的工程在很快和很慢的机器上都可以正常运行。 您会注意到我们在 MIN 和 MAG 时都采用了GL_NEAREST,你可以混合使用 GL_NEAREST 和 GL_LINEAR。 纹理看起来效果会好些,但我们更关心速度,所以全采用低质量贴图。MIN_FILTER在图像绘制时小于贴图的原始尺寸时采用。 MAG_FILTER在图像绘制时大于贴图的原始尺寸时采用。 */ gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) //小于原始尺寸时用NEAREST处理 gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) //大于原始尺寸时用NEAREST处理 // Texture 2 textures[1].Bind(gl.TEXTURE_2D) //绑定第二个纹理 if !glfw.LoadTexture2D(texturefiles[0], 0) { //加载纹理 return errors.New("Failed to load texture: " + texturefiles[0]) } //纹理缩放时采用的处理方式 gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) /* 当图像在屏幕上变得很小的时候,很多细节将会丢失。刚才还很不错的图案变得很难看。 当您告诉OpenGL创建一个 mipmapped的纹理后,OpenGL将尝试创建不同尺寸的高质量纹理。 当您向屏幕绘制一个 mipmapped纹理的时候,OpenGL将选择它已经创建的外观最佳的纹理(带有更多细节)来绘制,而不仅仅是缩放原先的图像(这将导致细节丢失)。 我曾经说过有办法可以绕过OpenGL对纹理宽度和高度所加的限制——64、128、256,等等。 办法就是 gluBuild2DMipmaps。据我的发现,您可以使用任意的位图来创建纹理。OpenGL将自动将它缩放到正常的大小。 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); 使用三种颜色(红,绿,蓝)来生成一个2D纹理。 TextureImage[0]->sizeX 是位图宽度,extureImage[0]->sizeY 是位图高度,GL_RGB意味着我们依次使用RGB色彩。 GL_UNSIGNED_BYTE 意味着纹理数据的单位是字节。TextureImage[0]->data指向我们创建纹理所用的位图。 */ // Texture 3 textures[2].Bind(gl.TEXTURE_2D) //绑定处理第三个纹理 if !glfw.LoadTexture2D(texturefiles[0], glfw.BuildMipmapsBit) { //加载纹理 return errors.New("Failed to load texture: " + texturefiles[0]) } //指定缩放处理方式 gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR_MIPMAP_NEAREST) //golang用这个方式自动处理gluBuild2DMipmaps? return }
func loadTextures() (err error) { textures = make([]gl.Texture, len(texturefiles)) ///创建文件存储空间数组 gl.GenTextures(textures) ///告诉OpenGL我们想生成一个纹理名字 for i := range texturefiles { ///告诉OpenGL将纹理名字 texture[0] 绑定到纹理目标上。 ///2D纹理只有高度(在 Y 轴上)和宽度(在 X 轴上)。主函数将纹理名字指派给纹理数据。 ///本例中我们告知OpenGL, texture[i] 处的内存已经可用。我们创建的纹理将存储在 texture[i] 的 指向的内存区域。 textures[i].Bind(gl.TEXTURE_2D) ///绑定 if !glfw.LoadTexture2D(texturefiles[i], 0) { ///加载图片 return errors.New("Failed to load texture: " + texturefiles[i]) } /* 下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER ) 或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。 通常这两种情况下我都采用 GL_LINEAR 。这使得纹理从很远处到离屏幕很近时都平滑显示。 使用 GL_LINEAR 需要CPU和显卡做更多的运算。如果您的机器很慢,您也许应该采用 GL_NEAREST 。 过滤的纹理在放大的时候,看起来斑驳的很『译者注:马赛克啦』。您也可以结合这两种滤波方式。 在近处时使用 GL_LINEAR ,远处时 GL_NEAREST 。 */ gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) ///线形滤波 gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) ///线形滤波 } return }
func (rm *ResourceManager) loadTile(name string) (*Bitmap, bool) { fname, _ := filepath.Abs(path.Join("resources", name)) var tex gl.Texture allegro.RunInThread(func() { tex = gl.GenTexture() tex.Bind(gl.TEXTURE_2D) glfw.LoadTexture2D(fname, 0) }) bmp := Bitmap{tex, 0, 0, DEFAULT_TILE_WIDTH, DEFAULT_TILE_HEIGHT} rm.tileBmps[name] = bmp return &bmp, true }
func MakeTextureFromTGA(fname string) gl.Texture { tex := gl.GenTexture() tex.Bind(gl.TEXTURE_2D) glfw.LoadTexture2D(fname, 0) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.GenerateMipmap(gl.TEXTURE_2D) // glh.OpenGLSentinel() // check for errors return tex }
func loadTextures() (err error) { textures = make([]gl.Texture, len(texturefiles)) gl.GenTextures(textures) for i := range texturefiles { textures[i].Bind(gl.TEXTURE_2D) if !glfw.LoadTexture2D(texturefiles[i], 0) { return errors.New("Failed to load texture: " + texturefiles[i]) } gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) } return }