Nintendo OpenGL
This page's goal is to describe parts of Nintendo's OpenGL implementation for the 3DS as we reverse engineer it to better understand how to use the PICA200.
Description
The PICA200 is an opengl ES 1.1 compliant GPU manufactured by DMP. It comes loaded with a number of extensions that make it similar to an openGL ES 2.0 compliant GPU (ability to run programmable vertex/geometry shaders, for instance). Because of this, Nintendo wrapped GPU access into an openGL ES 2.0 implementation with some limitations. As the fragment stage of the pipeline is non-programmable, Nintendo instead gives developers the ability to configure a number of fragment-related values through glGetUniformLocation and glUniformXX. See below for the full list.
Shader program structure
When uniform values are set, they are attached to the current shader program and stored into the corresponding shader program structure.
Shader program struct :
Offset | Size | Description |
---|---|---|
0x000 | 0x04 | Value 0x0 ? |
0x004 | 0x04 | Program ID |
0x008 | 0x04 | Value -1 ? |
0x01C | 0x04 | Pointer to program-specific uniform table |
0x020 | 0x04 | Total number of uniforms for program |
0x028 | 0x04 | Number of program-specific uniforms |
0x64C | 0x04 | Value for GPU register 0x0104 |
0x7C0 | 0x04 | Bitfield containing dmp_FragmentLightSource[n].shadowed values |
0x7D8 | 0x04 | Bitfield containing dmp_FragmentLightSource[n].geomFactor0 / dmp_FragmentLightSource[n].geomFactor1 / dmp_FragmentLightSource[n].twoSideDiffuse values |
0xA20 | 0x70*8 | Table of structs for 8 dmp_FragmentLightSource |
dmp_FragmentLightSource struct:
Offset | Size | Description |
---|---|---|
0x00 | 0x01 | dmp_FragmentLightSource[k].enabled |
0x04 | 0x10 | dmp_FragmentLightSource[k].ambient (float[4]) |
0x14 | 0x10 | dmp_FragmentLightSource[k].diffuse (float[4]) |
0x24 | 0x10 | dmp_FragmentLightSource[k].specular0 (float[4]) |
0x34 | 0x10 | dmp_FragmentLightSource[k].specular1 (float[4]) |
0x44 | 0x10 | dmp_FragmentLightSource[k].position (float[4]) |
0x54 | 0x10 | dmp_FragmentLightSource[k].spotDirection (float[3]) |
0x60 | 0x04 | dmp_FragmentLightSource[k].samplerSP (u32) |
0x64 | 0x04 | dmp_FragmentLightSource[k].distanceAttenuationBias (float) |
0x68 | 0x04 | dmp_FragmentLightSource[k].distanceAttenuationScale (float) |
Proposed REing methodology
1. Choose a "uniform" you want to RE below 2. Take note of its ID and type ! 3. Depending on whether its a float or not, go through the gigantic switches in shm_uniformfv or shm_uniformiv (non-float) based on the ID of your uniform 4. Once you find the piece of code specific to your uniform, take note of how the values passed to shm_uniformfv/shm_uniformiv are written to the shader object 5. Go through __shv_validateShaderValidator looking for where those fields written to in shm_uniformfv/shm_uniformiv are used and written to the GPU command buffer either directly or through __cb_writeRegs, __cb_multiWriteReg or __cb_fillRegs. 6. Document findings on 3Dbrew ! (that's the most important step)
Fragment "uniform" list
Uniform ID | Type | Name |
---|---|---|
0x0 | GL_BOOL | dmp_Texture[0].perspectiveShadow |
0x1 | GL_FLOAT | dmp_Texture[0].shadowZBias |
0x2 | GL_FLOAT | dmp_Texture[0].shadowZScale |
0x3 | GL_INT | dmp_Texture[0].samplerType |
0x4 | GL_INT | dmp_Texture[1].samplerType |
0x5 | GL_INT | dmp_Texture[2].samplerType |
0x6 | GL_INT | dmp_Texture[3].samplerType |
0x7 | GL_INT | dmp_Texture[2].texcoord |
0x8 | GL_INT | dmp_Texture[3].texcoord |
0x9 | GL_INT | dmp_Texture[3].ptRgbMap |
0xA | GL_INT | dmp_Texture[3].ptAlphaMap |
0xB | GL_BOOL | dmp_Texture[3].ptAlphaSeparate |
0xC | GL_INT | dmp_Texture[3].ptClampU |
0xD | GL_INT | dmp_Texture[3].ptClampV |
0xE | GL_INT | dmp_Texture[3].ptShiftU |
0xF | GL_INT | dmp_Texture[3].ptShiftV |
0x10 | GL_INT | dmp_Texture[3].ptMinFilter |
0x11 | GL_INT | dmp_Texture[3].ptTexWidth |
0x12 | GL_INT | dmp_Texture[3].ptTexOffset |
0x13 | GL_FLOAT | dmp_Texture[3].ptTexBias |
0x14 | GL_BOOL | dmp_Texture[3].ptNoiseEnable |
0x15 | GL_FLOAT_VEC3 | dmp_Texture[3].ptNoiseU |
0x16 | GL_FLOAT_VEC3 | dmp_Texture[3].ptNoiseV |
0x17 | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerRgbMap |
0x18 | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerAlphaMap |
0x19 | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerNoiseMap |
0x1A | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerR |
0x1B | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerG |
0x1C | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerB |
0x1D | GL_SAMPLER_1D | dmp_Texture[3].ptSamplerA |
0x1E | GL_INT | dmp_FragOperation.mode |
0x1F | GL_FLOAT | dmp_FragOperation.penumbraScale |
0x20 | GL_FLOAT | dmp_FragOperation.penumbraBias |
0x21 | GL_FLOAT | dmp_FragOperation.wScale |
0x22 | GL_BOOL | dmp_FragOperation.enableClippingPlane |
0x23 | GL_FLOAT_VEC4 | dmp_FragOperation.clippingPlane |
0x24 | GL_BOOL | dmp_FragOperation.enableAlphaTest |
0x25 | GL_INT | dmp_FragOperation.alphaTestFunc |
0x26 | GL_FLOAT | dmp_FragOperation.alphaRefValue |
0x27 | GL_FLOAT_VEC3 | dmp_Gas.lightXY |
0x28 | GL_FLOAT_VEC4 | dmp_Gas.lightZ |
0x29 | GL_FLOAT | dmp_Gas.deltaZ |
0x2A | GL_FLOAT | dmp_Gas.accMax |
0x2B | GL_BOOL | dmp_Gas.autoAcc |
0x2C | GL_FLOAT | dmp_Gas.attenuation |
0x2D | GL_INT | dmp_Gas.colorLutInput |
0x2E | GL_INT | dmp_Gas.shadingDensitySrc |
0x2F | GL_SAMPLER_1D | dmp_Gas.samplerTR |
0x30 | GL_SAMPLER_1D | dmp_Gas.samplerTG |
0x31 | GL_SAMPLER_1D | dmp_Gas.samplerTB |
0x32 | GL_BOOL | dmp_FragmentLighting.enabled |
0x33 | GL_FLOAT_VEC4 | dmp_FragmentLighting.ambient |
0x34 | GL_FLOAT_VEC4 | dmp_FragmentMaterial.emission |
0x35 | GL_FLOAT_VEC4 | dmp_FragmentMaterial.ambient |
0x36 | GL_FLOAT_VEC4 | dmp_FragmentMaterial.diffuse |
0x37 | GL_FLOAT_VEC4 | dmp_FragmentMaterial.specular0 |
0x38 | GL_FLOAT_VEC4 | dmp_FragmentMaterial.specular1 |
0x39 | GL_BOOL | dmp_FragmentLightSource[0].enabled |
0x3A | GL_BOOL | dmp_FragmentLightSource[1].enabled |
0x3B | GL_BOOL | dmp_FragmentLightSource[2].enabled |
0x3C | GL_BOOL | dmp_FragmentLightSource[3].enabled |
0x3D | GL_BOOL | dmp_FragmentLightSource[4].enabled |
0x3E | GL_BOOL | dmp_FragmentLightSource[5].enabled |
0x3F | GL_BOOL | dmp_FragmentLightSource[6].enabled |
0x40 | GL_BOOL | dmp_FragmentLightSource[7].enabled |
0x41 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[0].ambient |
0x42 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[1].ambient |
0x43 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[2].ambient |
0x44 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[3].ambient |
0x45 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[4].ambient |
0x46 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[5].ambient |
0x47 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[6].ambient |
0x48 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[7].ambient |
0x49 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[0].diffuse |
0x4A | GL_FLOAT_VEC4 | dmp_FragmentLightSource[1].diffuse |
0x4B | GL_FLOAT_VEC4 | dmp_FragmentLightSource[2].diffuse |
0x4C | GL_FLOAT_VEC4 | dmp_FragmentLightSource[3].diffuse |
0x4D | GL_FLOAT_VEC4 | dmp_FragmentLightSource[4].diffuse |
0x4E | GL_FLOAT_VEC4 | dmp_FragmentLightSource[5].diffuse |
0x4F | GL_FLOAT_VEC4 | dmp_FragmentLightSource[6].diffuse |
0x50 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[7].diffuse |
0x51 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[0].specular0 |
0x52 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[1].specular0 |
0x53 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[2].specular0 |
0x54 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[3].specular0 |
0x55 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[4].specular0 |
0x56 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[5].specular0 |
0x57 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[6].specular0 |
0x58 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[7].specular0 |
0x59 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[0].specular1 |
0x5A | GL_FLOAT_VEC4 | dmp_FragmentLightSource[1].specular1 |
0x5B | GL_FLOAT_VEC4 | dmp_FragmentLightSource[2].specular1 |
0x5C | GL_FLOAT_VEC4 | dmp_FragmentLightSource[3].specular1 |
0x5D | GL_FLOAT_VEC4 | dmp_FragmentLightSource[4].specular1 |
0x5E | GL_FLOAT_VEC4 | dmp_FragmentLightSource[5].specular1 |
0x5F | GL_FLOAT_VEC4 | dmp_FragmentLightSource[6].specular1 |
0x60 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[7].specular1 |
0x61 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[0].position |
0x62 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[1].position |
0x63 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[2].position |
0x64 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[3].position |
0x65 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[4].position |
0x66 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[5].position |
0x67 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[6].position |
0x68 | GL_FLOAT_VEC4 | dmp_FragmentLightSource[7].position |
0x69 | GL_FLOAT_VEC3 | dmp_FragmentLightSource[0].spotDirection |
0x6A | GL_FLOAT_VEC3 | dmp_FragmentLightSource[1].spotDirection |
0x6B | GL_FLOAT_VEC3 | dmp_FragmentLightSource[2].spotDirection |
0x6C | GL_FLOAT_VEC3 | dmp_FragmentLightSource[3].spotDirection |
0x6D | GL_FLOAT_VEC3 | dmp_FragmentLightSource[4].spotDirection |
0x6E | GL_FLOAT_VEC3 | dmp_FragmentLightSource[5].spotDirection |
0x6F | GL_FLOAT_VEC3 | dmp_FragmentLightSource[6].spotDirection |
0x70 | GL_FLOAT_VEC3 | dmp_FragmentLightSource[7].spotDirection |
0x71 | GL_BOOL | dmp_FragmentLightSource[0].shadowed |
0x72 | GL_BOOL | dmp_FragmentLightSource[1].shadowed |
0x73 | GL_BOOL | dmp_FragmentLightSource[2].shadowed |
0x74 | GL_BOOL | dmp_FragmentLightSource[3].shadowed |
0x75 | GL_BOOL | dmp_FragmentLightSource[4].shadowed |
0x76 | GL_BOOL | dmp_FragmentLightSource[5].shadowed |
0x77 | GL_BOOL | dmp_FragmentLightSource[6].shadowed |
0x78 | GL_BOOL | dmp_FragmentLightSource[7].shadowed |
0x79 | GL_BOOL | dmp_FragmentLightSource[0].geomFactor0 |
0x7A | GL_BOOL | dmp_FragmentLightSource[1].geomFactor0 |
0x7B | GL_BOOL | dmp_FragmentLightSource[2].geomFactor0 |
0x7C | GL_BOOL | dmp_FragmentLightSource[3].geomFactor0 |
0x7D | GL_BOOL | dmp_FragmentLightSource[4].geomFactor0 |
0x7E | GL_BOOL | dmp_FragmentLightSource[5].geomFactor0 |
0x7F | GL_BOOL | dmp_FragmentLightSource[6].geomFactor0 |
0x80 | GL_BOOL | dmp_FragmentLightSource[7].geomFactor0 |
0x81 | GL_BOOL | dmp_FragmentLightSource[0].geomFactor1 |
0x82 | GL_BOOL | dmp_FragmentLightSource[1].geomFactor1 |
0x83 | GL_BOOL | dmp_FragmentLightSource[2].geomFactor1 |
0x84 | GL_BOOL | dmp_FragmentLightSource[3].geomFactor1 |
0x85 | GL_BOOL | dmp_FragmentLightSource[4].geomFactor1 |
0x86 | GL_BOOL | dmp_FragmentLightSource[5].geomFactor1 |
0x87 | GL_BOOL | dmp_FragmentLightSource[6].geomFactor1 |
0x88 | GL_BOOL | dmp_FragmentLightSource[7].geomFactor1 |
0x89 | GL_BOOL | dmp_FragmentLightSource[0].twoSideDiffuse |
0x8A | GL_BOOL | dmp_FragmentLightSource[1].twoSideDiffuse |
0x8B | GL_BOOL | dmp_FragmentLightSource[2].twoSideDiffuse |
0x8C | GL_BOOL | dmp_FragmentLightSource[3].twoSideDiffuse |
0x8D | GL_BOOL | dmp_FragmentLightSource[4].twoSideDiffuse |
0x8E | GL_BOOL | dmp_FragmentLightSource[5].twoSideDiffuse |
0x8F | GL_BOOL | dmp_FragmentLightSource[6].twoSideDiffuse |
0x90 | GL_BOOL | dmp_FragmentLightSource[7].twoSideDiffuse |
0x91 | GL_SAMPLER_1D | dmp_FragmentLightSource[0].samplerSP |
0x92 | GL_SAMPLER_1D | dmp_FragmentLightSource[1].samplerSP |
0x93 | GL_SAMPLER_1D | dmp_FragmentLightSource[2].samplerSP |
0x94 | GL_SAMPLER_1D | dmp_FragmentLightSource[3].samplerSP |
0x95 | GL_SAMPLER_1D | dmp_FragmentLightSource[4].samplerSP |
0x96 | GL_SAMPLER_1D | dmp_FragmentLightSource[5].samplerSP |
0x97 | GL_SAMPLER_1D | dmp_FragmentLightSource[6].samplerSP |
0x98 | GL_SAMPLER_1D | dmp_FragmentLightSource[7].samplerSP |
0x99 | GL_BOOL | dmp_FragmentLightSource[0].spotEnabled |
0x9A | GL_BOOL | dmp_FragmentLightSource[1].spotEnabled |
0x9B | GL_BOOL | dmp_FragmentLightSource[2].spotEnabled |
0x9C | GL_BOOL | dmp_FragmentLightSource[3].spotEnabled |
0x9D | GL_BOOL | dmp_FragmentLightSource[4].spotEnabled |
0x9E | GL_BOOL | dmp_FragmentLightSource[5].spotEnabled |
0x9F | GL_BOOL | dmp_FragmentLightSource[6].spotEnabled |
0xA0 | GL_BOOL | dmp_FragmentLightSource[7].spotEnabled |
0xA1 | GL_FLOAT | dmp_FragmentLightSource[0].distanceAttenuationBias |
0xA2 | GL_FLOAT | dmp_FragmentLightSource[1].distanceAttenuationBias |
0xA3 | GL_FLOAT | dmp_FragmentLightSource[2].distanceAttenuationBias |
0xA4 | GL_FLOAT | dmp_FragmentLightSource[3].distanceAttenuationBias |
0xA5 | GL_FLOAT | dmp_FragmentLightSource[4].distanceAttenuationBias |
0xA6 | GL_FLOAT | dmp_FragmentLightSource[5].distanceAttenuationBias |
0xA7 | GL_FLOAT | dmp_FragmentLightSource[6].distanceAttenuationBias |
0xA8 | GL_FLOAT | dmp_FragmentLightSource[7].distanceAttenuationBias |
0xA9 | GL_FLOAT | dmp_FragmentLightSource[0].distanceAttenuationScale |
0xAA | GL_FLOAT | dmp_FragmentLightSource[1].distanceAttenuationScale |
0xAB | GL_FLOAT | dmp_FragmentLightSource[2].distanceAttenuationScale |
0xAC | GL_FLOAT | dmp_FragmentLightSource[3].distanceAttenuationScale |
0xAD | GL_FLOAT | dmp_FragmentLightSource[4].distanceAttenuationScale |
0xAE | GL_FLOAT | dmp_FragmentLightSource[5].distanceAttenuationScale |
0xAF | GL_FLOAT | dmp_FragmentLightSource[6].distanceAttenuationScale |
0xB0 | GL_FLOAT | dmp_FragmentLightSource[7].distanceAttenuationScale |
0xB1 | GL_BOOL | dmp_FragmentLightSource[0].distanceAttenuationEnabled |
0xB2 | GL_BOOL | dmp_FragmentLightSource[1].distanceAttenuationEnabled |
0xB3 | GL_BOOL | dmp_FragmentLightSource[2].distanceAttenuationEnabled |
0xB4 | GL_BOOL | dmp_FragmentLightSource[3].distanceAttenuationEnabled |
0xB5 | GL_BOOL | dmp_FragmentLightSource[4].distanceAttenuationEnabled |
0xB6 | GL_BOOL | dmp_FragmentLightSource[5].distanceAttenuationEnabled |
0xB7 | GL_BOOL | dmp_FragmentLightSource[6].distanceAttenuationEnabled |
0xB8 | GL_BOOL | dmp_FragmentLightSource[7].distanceAttenuationEnabled |
0xB9 | GL_SAMPLER_1D | dmp_FragmentLightSource[0].samplerDA |
0xBA | GL_SAMPLER_1D | dmp_FragmentLightSource[1].samplerDA |
0xBB | GL_SAMPLER_1D | dmp_FragmentLightSource[2].samplerDA |
0xBC | GL_SAMPLER_1D | dmp_FragmentLightSource[3].samplerDA |
0xBD | GL_SAMPLER_1D | dmp_FragmentLightSource[4].samplerDA |
0xBE | GL_SAMPLER_1D | dmp_FragmentLightSource[5].samplerDA |
0xBF | GL_SAMPLER_1D | dmp_FragmentLightSource[6].samplerDA |
0xC0 | GL_SAMPLER_1D | dmp_FragmentLightSource[7].samplerDA |
0xC1 | GL_BOOL | dmp_LightEnv.absLutInputD0 |
0xC2 | GL_BOOL | dmp_LightEnv.absLutInputD1 |
0xC3 | GL_BOOL | dmp_LightEnv.absLutInputSP |
0xC4 | GL_BOOL | dmp_LightEnv.absLutInputFR |
0xC5 | GL_BOOL | dmp_LightEnv.absLutInputRB |
0xC6 | GL_BOOL | dmp_LightEnv.absLutInputRG |
0xC7 | GL_BOOL | dmp_LightEnv.absLutInputRR |
0xC8 | GL_INT | dmp_LightEnv.lutInputD0 |
0xC9 | GL_INT | dmp_LightEnv.lutInputD1 |
0xCA | GL_INT | dmp_LightEnv.lutInputSP |
0xCB | GL_INT | dmp_LightEnv.lutInputFR |
0xCC | GL_INT | dmp_LightEnv.lutInputRB |
0xCD | GL_INT | dmp_LightEnv.lutInputRG |
0xCE | GL_INT | dmp_LightEnv.lutInputRR |
0xCF | GL_FLOAT | dmp_LightEnv.lutScaleD0 |
0xD0 | GL_FLOAT | dmp_LightEnv.lutScaleD1 |
0xD1 | GL_FLOAT | dmp_LightEnv.lutScaleSP |
0xD2 | GL_FLOAT | dmp_LightEnv.lutScaleFR |
0xD3 | GL_FLOAT | dmp_LightEnv.lutScaleRB |
0xD4 | GL_FLOAT | dmp_LightEnv.lutScaleRG |
0xD5 | GL_FLOAT | dmp_LightEnv.lutScaleRR |
0xD6 | GL_SAMPLER_1D | dmp_FragmentMaterial.samplerD0 |
0xD7 | GL_SAMPLER_1D | dmp_FragmentMaterial.samplerD1 |
0xD8 | GL_SAMPLER_1D | dmp_FragmentMaterial.samplerFR |
0xD9 | GL_SAMPLER_1D | dmp_FragmentMaterial.samplerRB |
0xDA | GL_SAMPLER_1D | dmp_FragmentMaterial.samplerRG |
0xDB | GL_SAMPLER_1D | dmp_FragmentMaterial.samplerRR |
0xDC | GL_INT | dmp_LightEnv.shadowSelector |
0xDD | GL_INT | dmp_LightEnv.bumpSelector |
0xDE | GL_INT | dmp_LightEnv.bumpMode |
0xDF | GL_BOOL | dmp_LightEnv.bumpRenorm |
0xE0 | GL_INT | dmp_LightEnv.config |
0xE1 | GL_BOOL | dmp_LightEnv.invertShadow |
0xE2 | GL_BOOL | dmp_LightEnv.shadowPrimary |
0xE3 | GL_BOOL | dmp_LightEnv.shadowSecondary |
0xE4 | GL_BOOL | dmp_LightEnv.shadowAlpha |
0xE5 | GL_INT | dmp_LightEnv.fresnelSelector |
0xE6 | GL_BOOL | dmp_LightEnv.clampHighlights |
0xE7 | GL_BOOL | dmp_LightEnv.lutEnabledD0 |
0xE8 | GL_BOOL | dmp_LightEnv.lutEnabledD1 |
0xE9 | GL_BOOL | dmp_LightEnv.lutEnabledRefl |
0xEA | GL_INT | dmp_TexEnv[0].combineRgb |
0xEB | GL_INT | dmp_TexEnv[1].combineRgb |
0xEC | GL_INT | dmp_TexEnv[2].combineRgb |
0xED | GL_INT | dmp_TexEnv[3].combineRgb |
0xEE | GL_INT | dmp_TexEnv[4].combineRgb |
0xEF | GL_INT | dmp_TexEnv[5].combineRgb |
0xF0 | GL_INT | dmp_TexEnv[0].combineAlpha |
0xF1 | GL_INT | dmp_TexEnv[1].combineAlpha |
0xF2 | GL_INT | dmp_TexEnv[2].combineAlpha |
0xF3 | GL_INT | dmp_TexEnv[3].combineAlpha |
0xF4 | GL_INT | dmp_TexEnv[4].combineAlpha |
0xF5 | GL_INT | dmp_TexEnv[5].combineAlpha |
0xF6 | GL_INT_VEC3 | dmp_TexEnv[0].srcRgb |
0xF7 | GL_INT_VEC3 | dmp_TexEnv[1].srcRgb |
0xF8 | GL_INT_VEC3 | dmp_TexEnv[2].srcRgb |
0xF9 | GL_INT_VEC3 | dmp_TexEnv[3].srcRgb |
0xFA | GL_INT_VEC3 | dmp_TexEnv[4].srcRgb |
0xFB | GL_INT_VEC3 | dmp_TexEnv[5].srcRgb |
0xFC | GL_INT_VEC3 | dmp_TexEnv[0].srcAlpha |
0xFD | GL_INT_VEC3 | dmp_TexEnv[1].srcAlpha |
0xFE | GL_INT_VEC3 | dmp_TexEnv[2].srcAlpha |
0xFF | GL_INT_VEC3 | dmp_TexEnv[3].srcAlpha |
0x100 | GL_INT_VEC3 | dmp_TexEnv[4].srcAlpha |
0x101 | GL_INT_VEC3 | dmp_TexEnv[5].srcAlpha |
0x102 | GL_INT_VEC3 | dmp_TexEnv[0].operandRgb |
0x103 | GL_INT_VEC3 | dmp_TexEnv[1].operandRgb |
0x104 | GL_INT_VEC3 | dmp_TexEnv[2].operandRgb |
0x105 | GL_INT_VEC3 | dmp_TexEnv[3].operandRgb |
0x106 | GL_INT_VEC3 | dmp_TexEnv[4].operandRgb |
0x107 | GL_INT_VEC3 | dmp_TexEnv[5].operandRgb |
0x108 | GL_INT_VEC3 | dmp_TexEnv[0].operandAlpha |
0x109 | GL_INT_VEC3 | dmp_TexEnv[1].operandAlpha |
0x10A | GL_INT_VEC3 | dmp_TexEnv[2].operandAlpha |
0x10B | GL_INT_VEC3 | dmp_TexEnv[3].operandAlpha |
0x10C | GL_INT_VEC3 | dmp_TexEnv[4].operandAlpha |
0x10D | GL_INT_VEC3 | dmp_TexEnv[5].operandAlpha |
0x10E | GL_FLOAT | dmp_TexEnv[0].scaleRgb |
0x10F | GL_FLOAT | dmp_TexEnv[1].scaleRgb |
0x110 | GL_FLOAT | dmp_TexEnv[2].scaleRgb |
0x111 | GL_FLOAT | dmp_TexEnv[3].scaleRgb |
0x112 | GL_FLOAT | dmp_TexEnv[4].scaleRgb |
0x113 | GL_FLOAT | dmp_TexEnv[5].scaleRgb |
0x114 | GL_FLOAT | dmp_TexEnv[0].scaleAlpha |
0x115 | GL_FLOAT | dmp_TexEnv[1].scaleAlpha |
0x116 | GL_FLOAT | dmp_TexEnv[2].scaleAlpha |
0x117 | GL_FLOAT | dmp_TexEnv[3].scaleAlpha |
0x118 | GL_FLOAT | dmp_TexEnv[4].scaleAlpha |
0x119 | GL_FLOAT | dmp_TexEnv[5].scaleAlpha |
0x11A | GL_FLOAT_VEC4 | dmp_TexEnv[0].constRgba |
0x11B | GL_FLOAT_VEC4 | dmp_TexEnv[1].constRgba |
0x11C | GL_FLOAT_VEC4 | dmp_TexEnv[2].constRgba |
0x11D | GL_FLOAT_VEC4 | dmp_TexEnv[3].constRgba |
0x11E | GL_FLOAT_VEC4 | dmp_TexEnv[4].constRgba |
0x11F | GL_FLOAT_VEC4 | dmp_TexEnv[5].constRgba |
0x120 | GL_FLOAT_VEC4 | dmp_TexEnv[0].bufferColor |
0x121 | GL_INT_VEC2 | dmp_TexEnv[1].bufferInput |
0x122 | GL_INT_VEC2 | dmp_TexEnv[2].bufferInput |
0x123 | GL_INT_VEC2 | dmp_TexEnv[3].bufferInput |
0x124 | GL_INT_VEC2 | dmp_TexEnv[4].bufferInput |
0x125 | GL_INT | dmp_Fog.mode |
0x126 | GL_FLOAT_VEC3 | dmp_Fog.color |
0x127 | GL_BOOL | dmp_Fog.zFlip |
0x128 | GL_SAMPLER_1D | dmp_Fog.sampler |