Win32 API 日本語リファレンス
ホームGraphics.OpenGL › glPixelTransferf

glPixelTransferf

関数
ピクセル転送時の変換係数を浮動小数点値で設定する。
DLLOPENGL32.dll呼出規約winapi

シグネチャ

// OPENGL32.dll
#include <windows.h>

void glPixelTransferf(
    DWORD pname,
    FLOAT param1
);

パラメーター

名前方向説明
pnameDWORDin設定するピクセル転送モード。GL_RED_SCALEやGL_RED_BIASなどを指定する。
param1FLOATin転送モードに設定する単精度の値。

戻り値の型: void

公式ドキュメント

glPixelTransferf 関数および glPixelTransferi 関数は、ピクセル転送モードを設定します。 | glPixelTransferf 関数 (Gl.h)

戻り値

この関数は値を返しません。

解説(Remarks)

glPixelTransfer 関数は、後続の glCopyPixelsglCopyTexImage1DglCopyTexImage2DglCopyTexSubImage1DglCopyTexSubImage2DglDrawPixelsglReadPixelsglTexImage1DglTexImage2DglTexSubImage1DglTexSubImage2D の各コマンドの動作に影響するピクセル転送モードを設定します。ピクセル転送モードで指定されるアルゴリズムは、ピクセルがフレームバッファーから読み取られた後 (glReadPixels および glCopyPixels)、またはクライアントメモリからアンパックされた後 (glDrawPixelsglTexImage1DglTexImage2D) に、そのピクセルに対して適用されます。ピクセル転送操作は、そのピクセル操作を引き起こしたコマンドに関係なく、常に同じ順序で同じ方法により実行されます。ピクセルストレージモード (glPixelStore) は、クライアントメモリから読み取られるピクセルのアンパックと、クライアントメモリへ書き戻されるピクセルのパックを制御します。

ピクセル転送操作は、4 つの基本的なピクセル型を扱います。すなわち color (色)、color index (カラーインデックス)、depth (深度)、stencil (ステンシル) です。color ピクセルは、仮数部と指数部のサイズが規定されていない 4 つの浮動小数点値で構成され、0.0 が強度ゼロ、1.0 が最大強度を表すようにスケーリングされます。color index は、2 進小数点以下の精度が規定されていない単一の固定小数点値です。depth ピクセルは、仮数部と指数部のサイズが規定されていない単一の浮動小数点値であり、0.0 が深度バッファーの最小値、1.0 が深度バッファーの最大値を表すようにスケーリングされます。最後に stencil ピクセルは、2 進小数点以下の精度が規定されていない単一の固定小数点値です。

4 つの基本ピクセル型に対して実行されるピクセル転送操作は、次のとおりです。

ピクセル型 ピクセル転送操作
Color 4 つの色成分はそれぞれスケール係数で乗算され、その後バイアス係数が加算されます。すなわち、赤成分は GL_RED_SCALE で乗算された後に GL_RED_BIAS が加算され、緑成分は GL_GREEN_SCALE で乗算された後に GL_GREEN_BIAS が加算され、青成分は GL_BLUE_SCALE で乗算された後に GL_BLUE_BIAS が加算され、アルファ成分は GL_ALPHA_SCALE で乗算された後に GL_ALPHA_BIAS が加算されます。4 つの色成分すべてがスケーリングとバイアス処理を受けた後、それぞれが範囲 [0,1] にクランプされます。色のスケール値およびバイアス値はすべて glPixelTransfer で指定します。
GL_MAP_COLOR が true の場合、各色成分は対応する色から色へのマップのサイズでスケーリングされ、スケーリングされた成分をインデックスとするそのマップの内容で置き換えられます。すなわち、赤成分は GL_PIXEL_MAP_R_TO_R_SIZE でスケーリングされ、自身をインデックスとする GL_PIXEL_MAP_R_TO_R の内容で置き換えられます。緑成分は GL_PIXEL_MAP_G_TO_G_SIZE でスケーリングされ、自身をインデックスとする GL_PIXEL_MAP_G_TO_G の内容で置き換えられます。青成分は GL_PIXEL_MAP_B_TO_B_SIZE でスケーリングされ、自身をインデックスとする GL_PIXEL_MAP_B_TO_B の内容で置き換えられます。アルファ成分は GL_PIXEL_MAP_A_TO_A_SIZE でスケーリングされ、自身をインデックスとする GL_PIXEL_MAP_A_TO_A の内容で置き換えられます。マップから取得されたすべての成分は、その後範囲 [0,1] にクランプされます。GL_MAP_COLORglPixelTransfer で指定します。各種マップの内容は glPixelMap で指定します。
Color index 各カラーインデックスは GL_INDEX_SHIFT ビットだけ左シフトされ、固定小数点インデックスが保持する小数ビット数を超えるビットはゼロで埋められます。GL_INDEX_SHIFT が負の場合はシフト方向が右になり、同様にゼロで埋められます。続いて GL_INDEX_OFFSET がインデックスに加算されます。GL_INDEX_SHIFTGL_INDEX_OFFSETglPixelTransfer で指定します。
この時点から、処理は結果として必要となるピクセルの形式に応じて分岐します。結果のピクセルがカラーインデックスバッファーへ書き込まれる場合、または GL_COLOR_INDEX 形式でクライアントメモリへ読み戻される場合、ピクセルは引き続きインデックスとして扱われます。GL_MAP_COLOR が true の場合、各インデックスは 2 ^ n 1 でマスクされます (nGL_PIXEL_MAP_I_TO_I_SIZE)。その後、マスクされた値をインデックスとする GL_PIXEL_MAP_I_TO_I の内容で置き換えられます。GL_MAP_COLORglPixelTransfer で指定します。インデックスマップの内容は glPixelMap で指定します。
結果のピクセルが RGBA カラーバッファーへ書き込まれる場合、または GL_COLOR_INDEX 以外の形式でクライアントメモリへ読み戻される場合、ピクセルは GL_PIXEL_MAP_I_TO_RGL_PIXEL_MAP_I_TO_GGL_PIXEL_MAP_I_TO_BGL_PIXEL_MAP_I_TO_A の 4 つのマップを参照することで、インデックスから色へ変換されます。参照される前に、インデックスは 2 n 1 でマスクされます。ここで n は、赤のマップでは GL_PIXEL_MAP_I_TO_R_SIZE、緑のマップでは GL_PIXEL_MAP_I_TO_G_SIZE、青のマップでは GL_PIXEL_MAP_I_TO_B_SIZE、アルファのマップでは GL_PIXEL_MAP_I_TO_A_SIZE です。マップから取得されたすべての成分は、その後範囲 [0,1] にクランプされます。4 つのマップの内容は glPixelMap で指定します。
Depth 各深度値は GL_DEPTH_SCALE で乗算され、GL_DEPTH_BIAS が加算された後、範囲 [0,1] にクランプされます。
Stencil 各インデックスは、カラーインデックスと同様に GL_INDEX_SHIFT ビットだけシフトされ、その後 GL_INDEX_OFFSET が加算されます。GL_MAP_STENCIL が true の場合、各インデックスは 2n 1 でマスクされ (nGL_PIXEL_MAP_S_TO_S_SIZE)、マスクされた値をインデックスとする GL_PIXEL_MAP_S_TO_S の内容で置き換えられます。

glPixelTransferf 関数は、任意のピクセル転送パラメーターの設定に使用できます。パラメーターの型が Boolean の場合、0.0 は false を意味し、それ以外の値は true を意味します。pname が整数のパラメーターである場合、param は最も近い整数に丸められます。

同様に、glPixelTransferi も任意のピクセル転送パラメーターの設定に使用できます。Boolean のパラメーターは、param が 0 の場合は false に、それ以外の場合は true に設定されます。param パラメーターは、実数値のパラメーターに代入される前に浮動小数点数へ変換されます。

glDrawPixelsglReadPixelsglCopyPixelsglTexImage1DglTexImage2D の各コマンドがディスプレイリストに格納された場合 (glNewList および glCallList を参照)、使用されるのは、そのディスプレイリストが実行されるときに有効なピクセル転送モードの設定です。この設定は、コマンドがディスプレイリストにコンパイルされたときの設定とは異なる場合があります。

次の関数は、glPixelTransfer に関連する情報を取得します。

引数 GL_MAP_COLOR を指定した glGet

引数 GL_MAP_STENCIL を指定した glGet

引数 GL_INDEX_SHIFT を指定した glGet

引数 GL_INDEX_OFFSET を指定した glGet

引数 GL_RED_SCALE を指定した glGet

引数 GL_RED_BIAS を指定した glGet

引数 GL_GREEN_SCALE を指定した glGet

引数 GL_GREEN_BIAS を指定した glGet

引数 GL_BLUE_SCALE を指定した glGet

引数 GL_BLUE_BIAS を指定した glGet

引数 GL_ALPHA_SCALE を指定した glGet

引数 GL_ALPHA_BIAS を指定した glGet

引数 GL_DEPTH_SCALE を指定した glGet

引数 GL_DEPTH_BIAS を指定した glGet

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp)

各言語での呼び出し定義

// OPENGL32.dll
#include <windows.h>

void glPixelTransferf(
    DWORD pname,
    FLOAT param1
);
[DllImport("OPENGL32.dll", ExactSpelling = true)]
static extern void glPixelTransferf(
    uint pname,   // DWORD
    float param1   // FLOAT
);
<DllImport("OPENGL32.dll", ExactSpelling:=True)>
Public Shared Sub glPixelTransferf(
    pname As UInteger,   ' DWORD
    param1 As Single   ' FLOAT
)
End Sub
' pname : DWORD
' param1 : FLOAT
Declare PtrSafe Sub glPixelTransferf Lib "opengl32" ( _
    ByVal pname As Long, _
    ByVal param1 As Single)
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

glPixelTransferf = ctypes.windll.opengl32.glPixelTransferf
glPixelTransferf.restype = None
glPixelTransferf.argtypes = [
    wintypes.DWORD,  # pname : DWORD
    ctypes.c_float,  # param1 : FLOAT
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('OPENGL32.dll')
glPixelTransferf = Fiddle::Function.new(
  lib['glPixelTransferf'],
  [
    -Fiddle::TYPE_INT,  # pname : DWORD
    Fiddle::TYPE_FLOAT,  # param1 : FLOAT
  ],
  Fiddle::TYPE_VOID)
#[link(name = "opengl32")]
extern "system" {
    fn glPixelTransferf(
        pname: u32,  // DWORD
        param1: f32  // FLOAT
    );
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("OPENGL32.dll")]
public static extern void glPixelTransferf(uint pname, float param1);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OPENGL32_glPixelTransferf' -Namespace Win32 -PassThru
# $api::glPixelTransferf(pname, param1)
#uselib "OPENGL32.dll"
#func global glPixelTransferf "glPixelTransferf" sptr, float
; glPixelTransferf pname, param1
; pname : DWORD -> "sptr"
; param1 : FLOAT -> "float"
#uselib "OPENGL32.dll"
#func global glPixelTransferf "glPixelTransferf" int, float
; glPixelTransferf pname, param1
; pname : DWORD -> "int"
; param1 : FLOAT -> "float"
; void glPixelTransferf(DWORD pname, FLOAT param1)
#uselib "OPENGL32.dll"
#func global glPixelTransferf "glPixelTransferf" int, float
; glPixelTransferf pname, param1
; pname : DWORD -> "int"
; param1 : FLOAT -> "float"
import (
	"math"
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	opengl32 = windows.NewLazySystemDLL("OPENGL32.dll")
	procglPixelTransferf = opengl32.NewProc("glPixelTransferf")
)

// pname (DWORD), param1 (FLOAT)
r1, _, err := procglPixelTransferf.Call(
	uintptr(pname),
	uintptr(math.Float32bits(param1)),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void
// 注意: float/double 引数は proc.Call では XMM レジスタに渡せません。
// windows.SyscallN(proc.Addr(), math.Float64bits(x), ...) もしくは cgo を使用してください。
procedure glPixelTransferf(
  pname: DWORD;   // DWORD
  param1: Single   // FLOAT
); stdcall;
  external 'OPENGL32.dll' name 'glPixelTransferf';
result := DllCall("OPENGL32\glPixelTransferf"
    , "UInt", pname   ; DWORD
    , "Float", param1   ; FLOAT
    , "Int")   ; return: void
●glPixelTransferf(pname, param1) = DLL("OPENGL32.dll", "int glPixelTransferf(dword, float)")
# 呼び出し: glPixelTransferf(pname, param1)
# pname : DWORD -> "dword"
# param1 : FLOAT -> "float"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "opengl32" fn glPixelTransferf(
    pname: u32, // DWORD
    param1: f32 // FLOAT
) callconv(std.os.windows.WINAPI) void;
proc glPixelTransferf(
    pname: uint32,  # DWORD
    param1: float32  # FLOAT
) {.importc: "glPixelTransferf", stdcall, dynlib: "OPENGL32.dll".}
pragma(lib, "opengl32");
extern(Windows)
void glPixelTransferf(
    uint pname,   // DWORD
    float param1   // FLOAT
);
ccall((:glPixelTransferf, "OPENGL32.dll"), stdcall, Cvoid,
      (UInt32, Float32),
      pname, param1)
# pname : DWORD -> UInt32
# param1 : FLOAT -> Float32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void glPixelTransferf(
    uint32_t pname,
    float param1);
]]
local opengl32 = ffi.load("opengl32")
-- opengl32.glPixelTransferf(pname, param1)
-- pname : DWORD
-- param1 : FLOAT
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('OPENGL32.dll');
const glPixelTransferf = lib.func('__stdcall', 'glPixelTransferf', 'void', ['uint32_t', 'float']);
// glPixelTransferf(pname, param1)
// pname : DWORD -> 'uint32_t'
// param1 : FLOAT -> 'float'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("OPENGL32.dll", {
  glPixelTransferf: { parameters: ["u32", "f32"], result: "void" },
});
// lib.symbols.glPixelTransferf(pname, param1)
// pname : DWORD -> "u32"
// param1 : FLOAT -> "f32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void glPixelTransferf(
    uint32_t pname,
    float param1);
C, "OPENGL32.dll");
// $ffi->glPixelTransferf(pname, param1);
// pname : DWORD
// param1 : FLOAT
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Opengl32 extends StdCallLibrary {
    Opengl32 INSTANCE = Native.load("opengl32", Opengl32.class);
    void glPixelTransferf(
        int pname,   // DWORD
        float param1   // FLOAT
    );
}
@[Link("opengl32")]
lib LibOPENGL32
  fun glPixelTransferf = glPixelTransferf(
    pname : UInt32,   # DWORD
    param1 : Float32   # FLOAT
  ) : Void
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef glPixelTransferfNative = Void Function(Uint32, Float);
typedef glPixelTransferfDart = void Function(int, double);
final glPixelTransferf = DynamicLibrary.open('OPENGL32.dll')
    .lookupFunction<glPixelTransferfNative, glPixelTransferfDart>('glPixelTransferf');
// pname : DWORD -> Uint32
// param1 : FLOAT -> Float
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
procedure glPixelTransferf(
  pname: DWORD;   // DWORD
  param1: Single   // FLOAT
); stdcall;
  external 'OPENGL32.dll' name 'glPixelTransferf';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "glPixelTransferf"
  c_glPixelTransferf :: Word32 -> CFloat -> IO ()
-- pname : DWORD -> Word32
-- param1 : FLOAT -> CFloat
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let glpixeltransferf =
  foreign "glPixelTransferf"
    (uint32_t @-> float @-> returning void)
(* pname : DWORD -> uint32_t *)
(* param1 : FLOAT -> float *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library opengl32 (t "OPENGL32.dll"))
(cffi:use-foreign-library opengl32)

(cffi:defcfun ("glPixelTransferf" gl-pixel-transferf :convention :stdcall) :void
  (pname :uint32)   ; DWORD
  (param1 :float))   ; FLOAT
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $glPixelTransferf = Win32::API::More->new('OPENGL32',
    'void glPixelTransferf(DWORD pname, float param1)');
# my $ret = $glPixelTransferf->Call($pname, $param1);
# pname : DWORD -> DWORD
# param1 : FLOAT -> float
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。